You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:12:53