【问题标题】:pandas DataFrame selecting list of rows from DateTimeIndex - KeyError. Understanding whypandas DataFrame 从 DateTimeIndex - KeyError 中选择行列表。了解原因
【发布时间】:2017-11-16 08:14:50
【问题描述】:

我试图了解为什么会出现此错误。我已经有了这个问题的解决方案,实际上已经解决了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,但找不到对此的解释。

【问题讨论】:

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

标签: python pandas dataframe python-datetime keyerror


【解决方案1】:

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

不过,Pandas 也试图让您的事情变得更轻松。特别是带有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 开发人员有时间编写代码的帮助程度。

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2015-01-22
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多