首页 > 解决方案 > 为什么 pandas 在日期索引表中查找日期时会生成 KeyError?

问题描述

考虑以下代码:

date_index = np.array(['2019-01-01', '2019-01-02'], dtype=np.datetime64)
df = pd.DataFrame({'a': np.array([1, 2])}, index=date_index)
date_to_lookup = date_index[0]
print(df.at[date_to_lookup, 'a'])

人们可能期望它能够工作并打印 1。但是(至少在3.7.3带有 Pandas的 Anaconda python 中0.24.2)它失败并出现以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../site-packages/pandas/core/indexing.py", line 2270, in __getitem__
    return self.obj._get_value(*key, takeable=self._takeable)
  File ".../site-packages/pandas/core/frame.py", line 2771, in _get_value
    return engine.get_value(series._values, index)
  File "pandas/_libs/index.pyx", line 81, in pandas._libs.index.IndexEngine.get_value
  File "pandas/_libs/index.pyx", line 89, in pandas._libs.index.IndexEngine.get_value
  File "pandas/_libs/index.pyx", line 447, in pandas._libs.index.DatetimeEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 987, in pandas._libs.hashtable.Int64HashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 993, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 17897

似乎Pandas DataFrame 和 Series 对象总是将日期存储为 dtype或,并且出现问题是因为 Pandas 在创建索引时会自动将dtype转换为,但在查找该索引中的元素时不会这样做。我可以通过将密钥转换为. 例如,以下两行都成功打印:'datetime64[ns]''datetime64[ns, tz]''datetime64[D]''datetime64[ns]''datetime64[ns]'1

print(df.at[pd.to_datetime(date_to_lookup), 'a'])
print(df.at[date_to_lookup.astype('datetime64[ns]'), 'a'])

这种行为(在创建索引时自动进行 dtype 转换,但在查找元素时不会)对我来说似乎违反直觉。以这种方式实施的原因是什么?是否需要遵循某种编码风格来避免此类错误?还是我应该提交的错误?

标签: pythonpandasnumpydatedatetime

解决方案


您可以通过按位置选择DataFrame.iatIndex.get_loc列的位置来避免这种情况a

print(df.iat[0, df.columns.get_loc('a')])
#alternative
#print(df.iloc[0, df.columns.get_loc('a')])
1

另一个想法是df.index用于选择date_index[0]

print(df.at[df.index[0], 'a'])

推荐阅读