使用zoneinfo替代pytz时,pd.date_range触发AttributeError问题排查
解决zoneinfo结合pd.date_range的AttributeError问题
问题分析
你遇到的报错是因为直接用replace(tzinfo=ZoneInfo(...))设置时区的方式,与pytz的localize()生成的时区对象在底层元数据上存在差异,尽管表面上start_date==start_date1返回True,但pandas(尤其是旧版本)对zoneinfo的ZoneInfo对象的内部处理逻辑不完善,导致计算时间间隔时出现None值,触发AttributeError: 'NoneType' object has no attribute 'total_seconds'。
解决方法
方法1:用astimezone()替代replace()设置时区
通过先创建UTC时间再转换到目标时区,确保时区规则被正确识别:
from datetime import datetime, timedelta from zoneinfo import ZoneInfo from dateutil.relativedelta import relativedelta import pandas as pd start_date1 = datetime(2021, 1, 1, 0, 0, 0) # 先绑定UTC时区,再转换到温哥华时区 start_date1 = start_date1.replace(tzinfo=ZoneInfo("UTC")).astimezone(ZoneInfo("America/Vancouver")) end_date1 = start_date1 + relativedelta(years=3) pd.date_range(start_date1, end_date1 - timedelta(days=1), freq='d')
方法2:使用pandas原生方法生成带时区的时间
利用pandas的to_datetime和tz_localize,自动处理时区兼容问题:
import pandas as pd from zoneinfo import ZoneInfo from dateutil.relativedelta import relativedelta start_date1 = pd.to_datetime("2021-01-01 00:00:00").tz_localize(ZoneInfo("America/Vancouver")) end_date1 = start_date1 + relativedelta(years=3) pd.date_range(start_date1, end_date1 - pd.Timedelta(days=1), freq='d')
方法3:升级pandas版本
确保使用pandas 1.3.0及以上版本,该版本开始正式支持Python 3.9+的zoneinfo模块。执行以下命令升级:
pip install --upgrade pandas
内容的提问来源于stack exchange,提问作者Aviv Fried
相关产品推荐
相关产品推荐

