我试图理解为什么我会收到此错误。我已经有了解决这个问题的方法,它实际上已经解决了here,只需要理解为什么它不能像我期望的那样工作。
我想了解为什么会引发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]"
正如here所解释的那样,解决方案就是:
df.loc[pd.to_datetime(['20130102','20130104']),:]
所以问题肯定在于loc将字符串列表作为从DateTimeIndex中选择的参数。但是,我可以看到以下调用对于此函数是可以的:
df.loc['20130102':'20130104',:]
和
df.loc['20130102']
我想了解它是如何工作的,并且会欣赏我可以使用的任何资源来预测此函数的行为,具体取决于它的调用方式。我从pandas文档中读到Indexing and Selecting Data和Time Series/Date functionality但无法找到解释。
答案 0 :(得分:1)
通常,当您将类似对象的数组传递给loc
时,Pandas将尝试在索引中找到该数组的每个元素。如果找不到,您将获得KeyError
。和!当索引中的值为Timestamp
时,你传递了一个字符串数组...所以这些字符串肯定不在索引中。
然而,熊猫也试图让事情变得更轻松。特别是,使用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会尝试将该标量解析为Timestamp
并查看该值是否在索引中。
如果您要传递slice
对象
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
只是通过了Pandas Devs有时间编码的有用程度的限制。