CET/CEST时间序列转UTC出现AmbiguousTimeError的解决方案咨询
解决方案
核心思路是先补全本地时间的完整小时级序列,再执行时区转换,既解决数据断裂导致的AmbiguousTimeError问题,也能自动补全缺失值。
通用兼容代码
该代码对格式正常和异常的csv文件都适用:
import pandas as pd # 读取文件 df = pd.read_csv('test_bad.csv') # 转换为无时区的datetime格式,按时间升序排序 df['local_time'] = pd.to_datetime(df['local_time']) df = df.sort_values('local_time').reset_index(drop=True) # 1. 生成覆盖整个数据周期的完整小时级本地时间序列,补全缺失时间点 full_local_naive = pd.date_range( start=df['local_time'].min(), end=df['local_time'].max(), freq='H' ) # 左合并实现缺失时间点补NaN df_full = pd.DataFrame({'local_time': full_local_naive}).merge(df, on='local_time', how='left') # 2. 执行时区转换,同时处理夏令时的两类特殊时间 df_full['utc_time'] = df_full['local_time']\ .dt.tz_localize( 'CET', ambiguous='infer', # 自动推断冬令时切换时重复时间的时区 non_existent='NaT' # 标记夏令时切换时不存在的时间点为NaT )\ .dt.tz_convert('UTC')\ .dt.strftime('%Y-%m-%d %H:%M:%S') # 可选:删除3月夏令时跳转时产生的无效NaT行(该时间点本身不存在) df_full = df_full.dropna(subset=['utc_time']).reset_index(drop=True)
效果说明
针对你给出的异常文件test_bad.csv,处理后2017年10月29日的时段结果如下:
| local_time | value | utc_time |
|---|---|---|
| 2017-10-29 01:00:00 | 7223 | 2017-10-28 23:00:00 |
| 2017-10-29 02:00:00 | 7224 | 2017-10-29 00:00:00 |
| 2017-10-29 02:00:00 | NaN | 2017-10-29 01:00:00 |
| 2017-10-29 03:00:00 | NaN | 2017-10-29 02:00:00 |
| 2017-10-29 04:00:00 | 7226 | 2017-10-29 03:00:00 |
完全符合需求:缺失的时间点自动补NaN,时区转换正常执行无报错。
内容的提问来源于stack exchange,提问作者Machine Yogi
相关产品推荐
相关产品推荐

