Pandas 使用具有多个索引的日期索引时出现问题

Pandas 使用具有多个索引的日期索引时出现问题,pandas,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.Mul

我试图了解
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
不是解决这个问题的正确方法吗?

你不需要使用
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')]

谢谢!也许这应该是一个单独的问题,但我如何选择id=H的行而不考虑日期?
df2.loc[(slice(None),'H'),:]
。看见