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