2016-07-20 69 views
4

我正在嘗試將日期時間索引重新採樣爲小時數據。我也想重新抽樣,直到月底。pandas - 重採樣日期時間索引並延伸至月底

所以給出如下df

data = np.arange(6).reshape(3,2) 
rng = ['Jan-2016', 'Feb-2016', 'Mar-2016'] 
df = pd.DataFrame(data, index=rng) 
df.index = pd.to_datetime(df.index) 

      0 1 
2016-01-01 0 1 
2016-02-01 2 3 
2016-03-01 4 5 

我知道我可以重新取樣到由每小時指數這樣的:df = df.resample('H').ffill()然而,當我打電話df它能夠在2016-03-01切割。我基本上使索引從小時粒度從1/1/2016運行到3/31/2016

考慮到最後一個索引是月份的開始,我如何將其延長至月末2015-03-31

回答

4

UPDATE:

In [37]: (df.set_index(df.index[:-1].union([df.index[-1] + pd.offsets.MonthEnd(0)])) 
    ....: .resample('H') 
    ....: .ffill() 
    ....: .head() 
    ....:) 
Out[37]: 
        0 1 
2016-01-01 00:00:00 0 1 
2016-01-01 01:00:00 0 1 
2016-01-01 02:00:00 0 1 
2016-01-01 03:00:00 0 1 
2016-01-01 04:00:00 0 1 

In [38]: (df.set_index(df.index[:-1].union([df.index[-1] + pd.offsets.MonthEnd(0)])) 
    ....: .resample('H') 
    ....: .ffill() 
    ....: .tail() 
    ....:) 
Out[38]: 
        0 1 
2016-03-30 20:00:00 2 3 
2016-03-30 21:00:00 2 3 
2016-03-30 22:00:00 2 3 
2016-03-30 23:00:00 2 3 
2016-03-31 00:00:00 4 5 

說明:

In [40]: df.index[-1] + pd.offsets.MonthEnd(0) 
Out[40]: Timestamp('2016-03-31 00:00:00') 

In [41]: df.index[:-1].union([df.index[-1] + pd.offsets.MonthEnd(0)]) 
Out[41]: DatetimeIndex(['2016-01-01', '2016-02-01', '2016-03-31'], dtype='datetime64[ns]', freq=None) 

老不正確的答案:

In [77]: df.resample('M').ffill().resample('H').ffill().tail() 
Out[77]: 
        0 1 
2016-03-30 20:00:00 2 3 
2016-03-30 21:00:00 2 3 
2016-03-30 22:00:00 2 3 
2016-03-30 23:00:00 2 3 
2016-03-31 00:00:00 4 5 
+0

感謝的快速反應。不過,我正在編輯這個問題。不幸的是,起始指數也成爲月末。我試圖讓指數的範圍從2016年1月1日 - 2016年3月31日 – sndrosilva

+0

@ kobrakai,是的,你說得對。我已經更新了我的答案 - 請檢查 – MaxU

+0

謝謝MaxU。我正在閱讀你使用的'union'和'pandas.offset.MonthEnd'函數。 – sndrosilva