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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:25:24