Python:如何为DataFrame的Datetime列正确添加含DST的时区并解决重复问题
问题描述
我有一个包含无时区Datetime列的DataFrame,处理夏令时(DST)变更时遇到问题:时钟拨快时出现缺失行,时钟拨慢时出现重复行。我写了一个自动适配DST的时区添加函数:
def fix_dutch_clock_shift(df): df_fixed = df.copy() pd.to_datetime(df_fixed['datetime']) amsterdam_tz = pytz.timezone('Europe/Amsterdam') for index, row in df_fixed.iterrows(): dt = row['datetime'] dt = amsterdam_tz.localize(dt) df_fixed.at[index, 'datetime'] = dt return df_fixed
这个函数在时钟拨快(时区从+01:00切换至+02:00)时正常,但时钟拨慢时,重复的时间点都被标记为+02:00,当前输出:
Datetime, Long, Short 2022-10-30 02:00:00+02:00,61.58,61.58 2022-10-30 02:15:00+02:00,49.98,49.98 2022-10-30 02:30:00+02:00,26.72,26.72 2022-10-30 02:45:00+02:00,-111.32,-111.32 2022-10-30 02:00:00+02:00,-111.32,-111.32 2022-10-30 02:15:00+02:00,-130.19,-130.19 2022-10-30 02:30:00+02:00,-6.69,-6.69 2022-10-30 02:45:00+02:00,-130.19,-130.19
我期望第二次出现2022-10-30 02:00时,时区切换为+01:00,目标输出:
Datetime, Long, Short 2022-10-30 02:00:00+02:00,61.58,61.58 2022-10-30 02:15:00+02:00,49.98,49.98 2022-10-30 02:30:00+02:00,26.72,26.72 2022-10-30 02:45:00+02:00,-111.32,-111.32 2022-10-30 02:00:00+01:00,-111.32,-111.32 2022-10-30 02:15:00+01:00,-130.19,-130.19 2022-10-30 02:30:00+01:00,-6.69,-6.69 2022-10-30 02:45:00+01:00,-130.19,-130.19
解决方案
问题核心是逐行localize无法区分重复本地时间的时区归属,改用pandas矢量化的tz_localize方法,通过参数自动推断模糊时间的时区即可解决。
修改后的函数:
import pandas as pd import pytz def fix_dutch_clock_shift(df): df_fixed = df.copy() # 确保datetime列转为datetime类型 df_fixed['datetime'] = pd.to_datetime(df_fixed['datetime']) # 批量添加时区,自动处理夏令时模糊时间 df_fixed['datetime'] = df_fixed['datetime'].dt.tz_localize( 'Europe/Amsterdam', ambiguous='infer', nonexistent='shift_forward' ) return df_fixed
关键参数说明
ambiguous='infer':pandas会根据时间序列的先后顺序,自动将第一次出现的重复本地时间标记为夏令时(+02:00),第二次出现的标记为标准时间(+01:00),完全匹配你的需求。nonexistent='shift_forward':处理时钟拨快时的缺失时间(如3月夏令时切换时消失的02:00-03:00时段),将缺失时间点偏移到下一个有效时间;也可根据需求改为'NaT'保留缺失标记。- 放弃
iterrows()逐行处理:这种方式效率低且无法利用序列连续性推断时区,矢量化方法更高效准确。
内容的提问来源于stack exchange,提问作者ivar martens
相关产品推荐
相关产品推荐

