带时间序列索引的DataFrame执行shift操作报NonExistentTimeError如何解决
解决方案
方案1:替换DateOffset为Timedelta(最推荐,改一行代码即可)
报错的核心原因是DateOffset属于日历时间偏移,会严格按照当地时钟的字面时间计算,碰到夏令时切换导致的不存在时间就会触发错误。你需要偏移的是固定15分钟时长,直接用绝对时间偏移pd.Timedelta即可自动规避该问题:
df['varb_shift']=df['varb'].shift(-1,freq=pd.Timedelta(minutes=15))
该方案按实际物理时长计算偏移,夏令时切换时会自动把不存在的2019-03-31 02:45:00映射到你数据集里存在的2019-03-31 03:00:00+02:00,完全匹配需求。
方案2:UTC时区中转
如果你的偏移逻辑必须使用日历时间规则,可以先把索引转为无夏令时跳变的UTC时区,完成偏移后再转回原时区:
# 索引转为UTC df_utc = df.tz_convert('UTC') # 执行偏移 df_utc['varb_shift'] = df_utc['varb'].shift(-1, freq=pd.DateOffset(minutes=15)) # 转回CET时区 df = df_utc.tz_convert('CET')
方案3:自定义不存在时间的处理规则
如果需要灵活调整非法时间的映射逻辑,可以单独对偏移后的时间戳做校正,通过nonexistent参数指定处理规则:
# 计算偏移后的时间戳 shifted_index = df.index + pd.DateOffset(minutes=-15) # 校正不存在的时间,这里用shift_forward直接跳到下一个合法时间 shifted_index = shifted_index.tz_localize(None).tz_localize('CET', nonexistent='shift_forward') # 映射对应列的值 df['varb_shift'] = df.set_axis(shifted_index)['varb'].reindex(df.index)
nonexistent参数支持多种规则:
shift_forward:跳转到下一个存在的合法时间shift_backward:回退到上一个存在的合法时间'NaT':不存在的时间设为空值
内容的提问来源于stack exchange,提问作者user13132640
相关产品推荐
相关产品推荐

