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

咨询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:20:33