pandas调用tz_localize设置欧洲时区触发NonExistentTimeError报错
报错原因
这个报错是夏令时切换导致的不存在时间点触发的:
欧洲/华沙(Europe/Warsaw)时区属于实行夏令时的区域,2022年3月27日是当年的夏令时切换日,当地时间到凌晨2点时会直接拨快1小时跳到凌晨3点,也就是说2022-03-27 02:00:00 ~ 02:59:59这个时间段在当地时区是完全不存在的。
你生成的30分钟间隔时间序列刚好覆盖了这个不存在的时间点,而tz_localize方法默认nonexistent="raise",遇到不存在的时间点就会直接抛出NonExistentTimeError。
解决方法
根据你的数据需求选对应方案即可:
- 方案1:过滤掉不存在的时间点
传入nonexistent="NaT"把不存在的时间点转成空值,后续直接删除空值即可:dates = dates.tz_localize('Europe/Warsaw', nonexistent='NaT') # 移除空时间点 dates = dates.dropna() - 方案2:偏移对齐到合法时间
如果不想丢失数据点,可以指定偏移规则,把不存在的时间点对齐到夏令时切换前后的合法时间:# 不存在的时间点向前偏移,对齐到夏令时切换后的第一个合法时间(即2022-03-27 03:00) dates = dates.tz_localize('Europe/Warsaw', nonexistent='shift_forward') # 也可以选择向后偏移,对齐到夏令时切换前的最后一个合法时间 # dates = dates.tz_localize('Europe/Warsaw', nonexistent='shift_backward') - 方案3:创建时间索引时直接指定时区(推荐)
最稳妥的方式是不要先生成无时区时间再做本地化,直接在date_range阶段传入时区参数,pandas会自动处理夏令时跳转逻辑,不会生成不存在的非法时间点:dates = pd.date_range( start="2022-01-01", end="2022-06-25", freq="30min", tz="Europe/Warsaw" )
内容的提问来源于stack exchange,提问作者sota
相关产品推荐
相关产品推荐

