Python 从DateTimeIndex-KeyError中选择行的数据帧列表。理解为什么

Python 从DateTimeIndex-KeyError中选择行的数据帧列表。理解为什么,python,pandas,dataframe,python-datetime,keyerror,Python,Pandas,Dataframe,Python Datetime,Keyerror,我试图理解为什么我会犯这个错误。我已经有了一个解决这个问题的方法,它实际上已经解决了,只需要理解为什么它不能像我期望的那样工作 我想了解为什么这会抛出一个关键错误: dates = pd.date_range('20130101', periods=4) df = pd.DataFrame(np.identity(4), index=dates, columns=list('ABCD')) df.loc[['20130102', '20130103'],:] 有以下反馈: KeyError:

我试图理解为什么我会犯这个错误。我已经有了一个解决这个问题的方法,它实际上已经解决了,只需要理解为什么它不能像我期望的那样工作

我想了解为什么这会抛出一个关键错误:

dates = pd.date_range('20130101', periods=4)
df = pd.DataFrame(np.identity(4), index=dates, columns=list('ABCD'))
df.loc[['20130102', '20130103'],:]
有以下反馈:

KeyError: "None of [['20130102', '20130103']] are in the [index]"
如前所述,解决方案就是:

df.loc[pd.to_datetime(['20130102','20130104']),:]
因此,问题肯定在于loc将字符串列表作为参数从DateTimeIndex中进行选择的方式。但是,我可以看到此函数的以下调用是正常的:

df.loc['20130102':'20130104',:]


我想了解它是如何工作的,并希望能够使用任何资源根据调用方式预测此函数的行为。我阅读了pandas文档,但找不到对此的解释。

通常,当您将类似数组的对象传递给
loc
时,pandas将尝试在索引中定位该数组的每个元素。如果它找不到它,您将得到一个
KeyError
。还有!当索引中的值为
Timestamp
s时,您传递了一个字符串数组。。。所以这些字符串肯定不在索引中

然而,熊猫也试图让事情变得更容易。特别是,如果要传递字符串标量,请使用
DatetimeIndex

df.loc['20130102']

A    0.0
B    1.0
C    0.0
D    0.0
Name: 2013-01-02 00:00:00, dtype: float64
Pandas将尝试将该标量解析为
时间戳
,并查看该值是否在索引中

如果要传递
切片
对象

df.loc['20130102':'20130104']

              A    B    C    D
2013-01-02  0.0  1.0  0.0  0.0
2013-01-03  0.0  0.0  1.0  0.0
2013-01-04  0.0  0.0  0.0  1.0
Pandas还将尝试将切片对象的位解析为
Timestamp
,并返回一个经过适当切片的数据帧


你的
KeyError
只是超出了熊猫开发者有时间编写代码的帮助范围。

如果有人有类似的问题,我要解决的是删除重复的索引:`df=df.loc[~df.index.duplicated(keep='first');sliced_df=df[start_time:end_time]`以及对索引进行排序:df=df.sort_index()
df.loc['20130102':'20130104']

              A    B    C    D
2013-01-02  0.0  1.0  0.0  0.0
2013-01-03  0.0  0.0  1.0  0.0
2013-01-04  0.0  0.0  0.0  1.0