pandas使用.loc访问datetime索引时部分日期触发KeyError
Pandas Datetime索引KeyError问题原因说明
以下是该问题的所有可能触发原因及验证、修复方案:
- 索引未排序
pandas对DatetimeIndex使用日期字符串做部分匹配筛选时,要求索引处于升序排序状态。若执行set_index('start time CA')后未对索引排序,部分版本的pandas仅支持精确值匹配,当索引中的2021-09-20记录带有时分秒时,就会触发KeyError。
验证逻辑:执行print(temp.index.is_monotonic_increasing),返回False即可确认该问题,修复方式为执行temp.sort_index(inplace=True)。 - 时区不匹配
若start time CA字段为带时区的datetime类型,你传入loc的'2021-09-20'字符串会被默认解析为无时区的datetime对象,二者时区不一致时无法匹配到对应记录。
验证逻辑:执行print(temp.index.tz)查看索引时区,统一筛选参数和索引的时区即可解决。 - 索引实际值与显示值不一致
pandas展示datetime类型数据时会默认截断时分秒,肉眼看到的2021-09-20记录,实际索引值可能是带时区的跨天时间、或刚好落在2021-09-19最后一毫秒的时间。
验证逻辑:执行print(temp.index[temp.index.date == pd.to_datetime('2021-09-20').date]),确认是否存在对应日期的真实索引值。 - 旧版本pandas兼容性bug
1.1.0以下版本的pandas存在DatetimeIndex部分匹配的已知缺陷,索引存在重复值、空值时会偶发合法日期字符串无法匹配的问题。
验证逻辑:执行print(pd.__version__)查看pandas版本,升级到1.2.0及以上版本即可修复。
内容的提问来源于stack exchange,提问作者Ruth Smith
相关产品推荐
相关产品推荐

