python - 为什么 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 转换,但在查找元素时不会)对我来说似乎违反直觉。以这种方式实施的原因是什么?是否需要遵循某种编码风格来避免此类错误?还是我应该提交的错误?
解决方案
您可以通过按位置选择DataFrame.iat
和Index.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'])
推荐阅读
- python - 从同一张excel表格上的多个表中制作单独的pandas dfs
- mysql - 警告:选项 --database 已被使用
- c++ - 程序在第二遍时不接受其他文件名
- php - 警告:非法字符串偏移 PHP 7 foreach
- java - 使用 HikariDataSource 作为数据源对象时,如何在应用程序启动时加载存储过程?
- python - pandas 将嵌套字典转换为 mutiIndex 行和列
- javascript - javascript如何在循环中并行使用异步等待
- javascript - 在js中逐行获取dom文本
- python - 不推荐使用调试参数。执行时 Python 记录库错误
- css - 为什么我的电话和传真 p 标签在苹果移动设备的页脚中出现错误?