2013-10-14 47 views
0

如何在Python中將'datetime.timedelta'對象轉換爲'pandas.tseries.offsets'?例如:datetime.timedelta(1)to_offset('1D')?長篇小說:我想繪製一張熊貓數據框與OHLC酒吧,但是當數據點太多時,酒吧太瘦,圖表變得不可讀。在這種情況下,我想計算一個更長的時間段,以便在我的圖表上獲得小於100個條。Python將類型'datetime.timedelta'轉換爲'pandas.tseries.offsets'

給出一個數據幀DF(數據可以每月週期性第二之間的任何東西)

  1. 第1步:數據幀週期:

    source_period = min([t2-t1 for t2, t1 in zip(df.index[1:], df.index[:-1])])

    (我不能使用df.index。 freq here)

  2. 第2步:估計目標週期:

    target_period = source_period * float(len(df.index))/100

  3. 第3步:組結合數據

    grouped_df = df.groupby(pd.TimeGrouper(period_convert(target_period))).agg(ohlc_combine)

我錯過了period_convert功能,我真的不知道從哪裏開始。

對於具有起點的緣故,我的荒謬醜陋的黑客攻擊這樣做:

target_datapoints = 100 
source_period = min([t2-t1 for t2, t1 in zip(df.index[1:], df.index[:-1])]) 
target_period = source_period.total_seconds() * float(len(df.index))/target_datapoints 
target_offset = str(int(target_period)) + 'S' 
target_df = df.groupby(pd.TimeGrouper(target_offset)).agg(ohlc_combine) 

問題:醜陋的,緩慢的,前衛的情況下沒有處理......

+0

你在做什麼? – Jeff

+0

@Jeff我在問題 – Sam

回答

1

你可以直接構建它

eg說來源期間是60S和現在target_period是301S,只是使用它。

如果您希望將這些更改爲「大」的時間段,你可以這樣做(需要numpy的1.7),(它返回一個字符串):

In [18]: pd.tslib.repr_timedelta64(np.timedelta64(timedelta(seconds=301)).astype('m8[ns]')) 
Out[18]: '00:05:01' 

但是,這幾乎是很難對付。

有一個函數可以很好地做到這一點。

+0

中回答,這只是表達期間的另一種方式嗎?它不能被'pd.TimeGrouper'使用。在問題中看到我的骯髒的解決方法。 – Sam

+0

我認爲你的解決方案很好 – Jeff