如何在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
相关产品推荐
相关产品推荐

