将ISO 8601日期时间字符串转换为pl.Datetime失败求助
解决Polars 0.15.7+解析含可变时区偏移的ISO8601字符串报错问题
问题分析
这个报错是Polars 0.15.7版本后引入的有意行为变更,并非Bug。此前版本中,strptime解析带不同时区偏移的字符串时,会自动忽略偏移或隐式转换为统一时间,但新版本对Datetime类型的时区一致性做了严格校验:如果目标类型是不带时区的pl.Datetime,所有待解析的字符串必须拥有完全相同的时区偏移,否则就会抛出Different timezones found during 'strptime' operation错误。
你的数据因夏令时(DST)存在+01:00和+02:00两种时区偏移,恰好触发了这个校验逻辑。
解决方案
根据需求,提供两种可行方案:
方案1:解析为带时区的统一Datetime类型(推荐)
如果需要保留原始时区的时间信息,可指定数据对应的时区(你的数据来自奥地利,对应Europe/Vienna时区),Polars会自动将不同偏移的时间转换为该时区的标准时间:
import polars as pl # 读取数据 df = pl.read_csv("COVID19_vaccination_timeline_v202210.csv") # 解析为带Europe/Vienna时区的Datetime df = df.with_columns( pl.col("date").str.strptime( pl.Datetime, fmt="%Y-%m-%dT%H:%M:%S%:z", time_zone="Europe/Vienna" ) )
方案2:转换为UTC时间(无时区)
如果不需要时区信息,只想得到统一的UTC时间,可先解析为带时区的类型,再转换为UTC并移除时区标记:
import polars as pl df = pl.read_csv("COVID19_vaccination_timeline_v202210.csv") df = df.with_columns( pl.col("date").str.strptime(pl.Datetime, fmt="%Y-%m-%dT%H:%M:%S%:z") # 转换为UTC时区 .dt.convert_time_zone("UTC") # 移除时区标记,得到无时区的Datetime .dt.replace_time_zone(None) )
简化写法:用str.to_datetime自动解析
Polars 0.15+支持自动识别ISO8601格式的字符串,无需手动指定格式,写法更简洁:
df = df.with_columns( pl.col("date").str.to_datetime(time_zone="Europe/Vienna") )
内容的提问来源于stack exchange,提问作者sobek
相关产品推荐
相关产品推荐

