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

如何在Pandas中处理夏令时(DST)避免AmbiguousTime/NonExistantTime错误

Pandas 夏令时(DST)场景下的datetime时区转换方案

我处理的大型数据集需要适配夏令时(DST),此前在stackoverflow间接找到了解决方案,现将该问题的解法直接呈现,方便其他用户快速查找。

问题与场景说明

核心需求是将Pandas中的datetime列转换为指定时区或UTC,若数据不涉及夏令时,该操作非常简单,但涉及夏令时就需要额外步骤处理歧义时间、无效时间两类特殊情况。

数据集样例

以下样例同时包含春秋两季夏令时的时间节点,数据为CSV格式:

2012-03-24 23:00;    4.9741
2012-03-25 00:00;    4.9443
2012-03-25 01:00;    4.9443
2012-03-25 02:00;    4.9160
2012-03-25 03:00;    4.8865
2012-03-25 04:00;    4.8865
2012-03-25 05:00;    4.8584
2012-10-27 22:00;    2.1982
2012-10-27 23:00;    2.1982
2012-10-28 00:00;    2.1982
2012-10-28 01:00;    2.1839
2012-10-28 02:00;    2.1839
2012-10-28 03:00;    2.1982
2012-10-28 04:00;    2.1839
2012-10-28 05:00;    2.1839

数据加载与预处理代码

import pandas 

df = pandas.read_csv('data_file_path', sep=';', encoding='utf-8')
def column_names(df):
    df.columns=['Time', 'Value']
    return df

df = column_names(df)

def change_str_column_to_float(df):
    df['Value'] = pandas.to_numeric(df['Value'])
    return df

df = change_str_column_to_float(df)

时区转换实现

完成数据清洗后,按以下步骤实现Time列到UTC或指定时区的转换:

# 1. 将字符串格式的Time列转为naive datetime类型(无自带时区信息)
df['Time'] = pandas.to_datetime(df['Time'])

# 2. 绑定原始数据对应的所属时区,处理夏令时特殊情况
# 示例中原始数据为欧洲中部时区,可替换为你实际对应的IANA时区标识,比如中国时区为Asia/Shanghai
# *ambiguous*参数用于处理夏令时回拨产生的重复时间,infer表示按时间顺序自动推断,也可设置为NaT将歧义时间置空
# *nonexistent*参数用于处理夏令时调快产生的不存在时间,shift_forward表示自动调整到最近的有效时间
df['Time'] = df['Time'].dt.tz_localize('Europe/Paris', ambiguous='infer', nonexistent='shift_forward')

# 3. 转换为目标时区,以下为转UTC的示例,替换UTC为对应IANA时区标识即可转其他时区
df['Time_UTC'] = df['Time'].dt.tz_convert('UTC')

参数说明

  • 时区统一使用IANA时区命名规则,避免使用CST、EST等易混淆的缩写
  • 若你的时间序列不是单调递增的,可将ambiguous设置为'NaT',手动处理歧义时间
  • nonexistent还支持'shift_backward'(调整到前一个有效时间)、'NaT'(置空)等选项,可根据业务需求选择

内容的提问来源于stack exchange,提问作者Pelle Martin Hesketh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:02