如何解决Pandas时区本地化时出现的AttributeError错误
问题:DatetimeIndex时区本地化报错AttributeError
我尝试为idaydf.index本地化时区,该索引信息如下:
DatetimeIndex(['2022-10-24 16:00:00', '2022-10-24 16:15:00', ... '2023-06-16 21:58:00', '2023-06-16 22:00:00'], dtype='datetime64[ns]', name='DateTime', length=9012, freq=None)
执行的代码:
idaydf.index = idaydf.index.tz_localize(LOCAL_TZ)
其中LOCAL_TZ的类型为:
_PytzShimTimezone(zoneinfo.ZoneInfo(key='Europe/London'), 'Europe/London')
运行后出现错误:
*** AttributeError: 'NoneType' object has no attribute 'total_seconds'
我的环境版本:
python3-3.11.3 pandas-1.5.3 pytz-2023.3-1 tzlocal 4.2
请问该如何解决此问题?
解决方案
这个报错是由于pandas 1.5.3与Python 3.11的zoneinfo/pytz Shim存在兼容性bug导致的,旧版pandas无法正确处理_PytzShimTimezone类型的时区对象,可通过以下方式解决:
1. 直接使用pytz原生时区对象
放弃tzlocal返回的Shim包装对象,直接用pytz获取时区:
import pytz LOCAL_TZ = pytz.timezone('Europe/London') idaydf.index = idaydf.index.tz_localize(LOCAL_TZ)
2. 升级pandas到兼容版本
pandas 1.5.x系列对Python 3.11的支持不完善,建议升级到pandas 1.5.4及以上版本(或直接升级至2.x版本),新版本修复了该时区兼容性问题:
pip install --upgrade pandas>=1.5.4
3. 将ZoneInfo对象转换为pytz兼容格式
若需保留zoneinfo的使用,可手动转换时区对象:
from zoneinfo import ZoneInfo import pytz LOCAL_TZ = pytz.timezone(ZoneInfo('Europe/London').key) idaydf.index = idaydf.index.tz_localize(LOCAL_TZ)
验证方法
修改代码后,可通过以下命令确认时区是否设置成功:
print(idaydf.index.tz)
正常输出应为Europe/London,且索引的datetime值会正确关联时区信息。
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

