pandas DataFrame从DateTimeIndex - KeyError中选择行列表。了解原因

时间:2017-11-16 08:14:51

标签: python pandas dataframe python-datetime keyerror

我试图理解为什么我会收到此错误。我已经有了解决这个问题的方法,它实际上已经解决了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 DataTime Series/Date functionality但无法找到解释。

1 个答案:

答案 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有时间编码的有用程度的限制。