如何使用tz_localize避免datetime索引时区本地化的连续性问题?
你遇到的重复和缺失是欧洲夏令时切换的正常现象:每年3月最后一个周日,欧洲/柏林时区会将时钟拨快1小时,从01:59直接跳转到03:00,当地时间2:00-2:59这一整段不存在。使用nonexistent='shift_forward'参数时,所有原本落在这个不存在时间段的时间都会被调整到03:00,自然就出现03:00重复、02:00缺失的情况。
你之前代码的报错是因为if判断后接的是切片得到的DataFrame对象,Python无法直接将DataFrame转为布尔值,因此抛出该错误。即使修复判断逻辑,逐行处理的方案效率极低,完全不需要使用。
最简解决方案
只需要在时区本地化后加2行代码处理重复时间即可,修改后的完整代码如下:
import pandas as pd file = 'data.csv' df = pd.read_csv(file,sep=";", header=0) df['datetime']=pd.to_datetime(df['datetime'],dayfirst=True) # 时区本地化 df['datetime']=df['datetime'].dt.tz_localize('Europe/Berlin',nonexistent='shift_forward') # 新增:处理重复时间,将后出现的重复时间回退1小时补全缺失的2点 dup_mask = df['datetime'].duplicated(keep='first') df.loc[dup_mask, 'datetime'] = df.loc[dup_mask, 'datetime'] - pd.Timedelta(hours=1) # 后续流程不变 df=df.interpolate(method='pad') df=df.set_index(['datetime']) df=df.sort_index(ascending=True)
方案说明
duplicated(keep='first')会标记除第一个出现的重复值之外的所有重复时间点- 将标记的重复时间减1小时,刚好把重复的03:00其中一条改为02:00,补全缺失的时间点,保证索引连续
- 该方案为通用方案,可自动适配每年的夏令时切换场景,不需要手动判断时间段
内容的提问来源于stack exchange,提问作者SonnePer
相关产品推荐
相关产品推荐

