2012-10-22 67 views
1

假設我們有一個月的時間序列,可能缺少月份,並且在將數據加載到帶有DatetimeIndex的pandas Series對象中時,我們希望確保每個日期觀察結果都標記爲月末日期。但是,原始輸入日期可能會在本月的任何地方出現,因此我們需要強制它們進行月末觀測。強制日期符合熊貓的給定頻率

我首先想到的是做這樣的事情:

import pandas as pd 
pd.DatetimeIndex([datetime(2012,1,20), datetime(2012,7,31)], freq='M') 

然而,這只是離開的日期爲爲[2012-01-20,2012-07-31]並不會強迫他們結束月份值[2012-01-31,2012-07-31]。

我的第二次嘗試:

ix = pd.DatetimeIndex([datetime(2012,1,20), datetime(2012,7,31)], freq='M') 
s = pd.Series(np.random.randn(len(ix)), index=ix) 
s.asfreq('M') 

但是這給:

2012-01-31  NaN 
2012-02-29  NaN 
2012-03-31  NaN 
2012-04-30  NaN 
2012-05-31  NaN 
2012-06-30  NaN 
2012-07-31 0.79173 
Freq: M 

asfreq函數的調用DatetimeIndex的date_range引擎蓋下。

如果我使用PeriodIndex而不是DatetimeIndex,此問題很容易解決;然而,我需要支持一些目前不支持PeriodIndex的頻率,據我所知,沒有辦法用我自己的Period頻率來擴展熊貓。

+0

爲您的最後一個例子是什麼輸出你想什麼呢? – root

+0

我只想要2012-01-31和2012-07-31的條目。但不是NaN,2012-01-31的價值應該是2012-01-20提供的。 – Abiel

回答

1

這是一個解決辦法,但它的工作原理,而無需使用periodindex

from pandas.tseries.offsets import * 

In [164]: s 
Out[164]: 
2012-01-20 -1.266376 
2012-07-31 -0.865573 

In [165]: s.index=s.index+MonthEnd(n=0) 

In [166]: s 
Out[166]: 
2012-01-31 -1.266376 
2012-07-31 -0.865573 
+0

謝謝,這是有效的。我之前曾嘗試過類似的方法,但並未考慮對MonthEnd使用n = 0參數,在這種情況下,這是非常重要的。 – Abiel

+1

's = s.resample('M',fill_method ='ffill')' –