pandas高版本将已明确时区的时间识别为歧义时间报错问题
问题根因
这是pandas 1.2~1.3版本的已知缺陷:当单个已本地化的带时区时间标量作为列值传入DataFrame构造函数时,pandas内部执行标量扩容为等长数组的逻辑存在漏洞,会先把标量转换为无时区信息的本地时间值,再重新绑定时区生成序列。
2021-11-07 01:00:00是美国纽约时区夏令时转冬令时的重复时刻,该时刻对应两个UTC时间:夏令时状态的UTC-04:00、冬令时状态的UTC-05:00,重新绑定时区的步骤丢失了原标量已有的夏令时状态标识,因此系统无法判断该时间属于哪个时段,抛出AmbiguousTimeError错误。
pandas 1.1.5版本不存在该扩容逻辑的问题,所以运行正常。
可行解决方案
- 方案1(最便捷,兼容各版本):构造DataFrame前先把时间标量转为等长的列表/序列,避免触发pandas内部的标量扩容逻辑,修改后的代码如下:
import pandas as pd dt = pd.to_datetime('2021-11-07 01:00:00-0400').tz_convert('America/New_York') pd.DataFrame({'datetime': [dt]*3, # 直接传入等长列表,不走有缺陷的标量扩容逻辑 'value': [3, 4, 5]})
- 方案2:升级pandas到1.4.0及以上版本,该缺陷已经在后续版本中完成修复,原代码可以直接运行。
- 方案3(如果无法升级也不想修改传参格式):可以在构造DataFrame前全局设置pandas处理歧义时间的默认规则,比如默认取夏令时或者冬令时版本,不过该方案会全局影响所有时间处理逻辑,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Ken Williams
相关产品推荐
相关产品推荐

