2015-05-08 89 views
2

我想了解pandas中索引編制的日期相關功能是如何工作的。使用多索引日期索引時遇到問題

如果我有這樣的數據幀:

dates = pd.date_range('6/1/2000', periods=12, freq='M') 
df1 = DataFrame(randn(12, 2), index=dates, columns=['A', 'B']) 

我知道,我們可以從2000年使用df1['2000']提取記錄或使用df1['2000-09':'2001-03']日期範圍。

但是假設,而不是我有一個數據幀具有多指標

index = pd.MultiIndex.from_arrays([dates, list('HIJKHIJKHIJK')], names=['date', 'id']) 
df2 = DataFrame(randn(12, 2), index=index, columns=['C', 'D']) 

有沒有辦法,因爲我們有一個單一的指標做了2000年提取行?看起來df2.xs('2000-06-30')適用於訪問特定日期,但df2.xs('2000')不返回任何內容。 xs不是正確的方式去做這件事嗎?

回答

4

您不需要爲此使用xs,但是您可以使用.loc索引。
您嘗試過的示例之一會看起來像df2.loc['2000-09':'2001-03']。唯一的問題是,使用多索引時'部分字符串解析'功能不起作用。所以,你必須提供實際的日期時間:

In [17]: df2.loc[pd.Timestamp('2000-09'):pd.Timestamp('2001-04')] 
Out[17]: 
         C   D 
date  id 
2000-09-30 K -0.441505 0.364074 
2000-10-31 H 2.366365 -0.404136 
2000-11-30 I 0.371168 1.218779 
2000-12-31 J -0.579180 0.026119 
2001-01-31 K 0.450040 1.048433 
2001-02-28 H 1.090321 1.676140 
2001-03-31 I -0.272268 0.213227 

但請注意,在這種情況下pd.Timestamp('2001-03')將被解釋爲2001-03-01 00:00:00(實際時刻)。因此,您必須稍微調整開始/停止值。

一個滿一年的選擇(例如df1['2000']),那麼將成爲df2.loc[pd.Timestamp('2000'):pd.Timestamp('2001')]df2.loc[pd.Timestamp('2000-01-01'):pd.Timestamp('2000-12-31')]

+0

謝謝!也許這應該是一個單獨的問題,但我怎麼會選擇任何與'ID = H'行而不考慮日期? – itzy

+1

''df2.loc [(slice(None),'H'),::]''。請參閱http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers – joris