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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:34:51