使用多索引处理日期索引时遇到问题

时间:2015-05-08 13:56:49

标签: pandas

我试图理解pandas中与索引相关的日期相关功能如何工作。

如果我有这个数据框:

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

我知道我们可以使用df1['2000']或使用df1['2000-09':'2001-03']的一系列日期从2000中提取记录。

但是假设我有一个带有多索引的数据框

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不是正确的方法吗?

1 个答案:

答案 0 :(得分: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')]