咨询Pandas中Africa/Cairo时区2023年夏令时不生效的解决办法
问题描述
埃及自2011年起停用夏令时(DST),但2023年4月28日起重新启用。但Pandas和pytz中的Africa/Cairo时区未同步该更新,导致2023年夏令时时段的时间戳本地化错误:
>>> pd.Timestamp('20100501').tz_localize('Africa/Cairo') Timestamp('2010-05-01 00:00:00+0300', tz='Africa/Cairo') >>> pd.Timestamp('20230501').tz_localize('Africa/Cairo') Timestamp('2023-05-01 00:00:00+0200', tz='Africa/Cairo') # 预期应为+0300
除手动指定时间偏移量外,如何在Pandas本地化时间戳时显式处理夏令时转换日期?
解决方案
1. 更新时区数据库(推荐方案)
Pandas、pytz依赖的时区数据库(tzdata或pytz内置数据)可能未包含埃及2023年恢复夏令时的最新规则,直接更新对应库即可自动修复问题:
- 若使用Pandas 1.3+(默认依赖
tzdata):
pip install --upgrade tzdata
- 若使用
pytz库:
pip install --upgrade pytz
更新完成后重新运行测试代码,2023-05-01的时区偏移会自动变为+0300,无需额外配置。
2. 手动自定义时区规则(应急方案)
如果无法更新时区库,可通过手动判断时间范围,结合固定偏移时区实现正确的本地化:
import pandas as pd def localize_egypt_time(dt): # 2023年夏令时起止日期:4月28日至10月27日 dst_2023_start = pd.Timestamp('2023-04-28') dst_2023_end = pd.Timestamp('2023-10-27') # 按时间段匹配时区规则 if dt >= dst_2023_start and dt < dst_2023_end: return dt.tz_localize('Etc/GMT-3') # UTC+3 elif dt >= pd.Timestamp('2011-01-01') and dt < dst_2023_start: return dt.tz_localize('Etc/GMT-2') # UTC+2(无夏令时) else: # 2010及之前使用原有Africa/Cairo时区规则 return dt.tz_localize('Africa/Cairo') # 测试验证 print(localize_egypt_time(pd.Timestamp('20230501'))) # 输出:Timestamp('2023-05-01 00:00:00+0300', tz='Etc/GMT-3')
注意
手动规则需要按需维护后续年份的夏令时切换日期,长期使用建议优先更新时区数据库。
内容的提问来源于stack exchange,提问作者Muhammed Afifi
相关产品推荐
相关产品推荐

