Polars中使用schema_overrides时自动解析字符串格式日期为Datetime类型的方法问询
我理解你的困扰——当用Polars的from_dicts或DataFrame构造器时,想通过schema_overrides强制日期列类型为pl.Datetime,但输入是字符串格式的日期(比如2020-02-11)时总是报错,还要手动先去掉日期列的schema配置、之后再转类型,确实有点麻烦。
先直接说结论:目前Polars还没有支持在schema_overrides或schema参数中自动将字符串日期解析为pl.Datetime的功能(类似2024年初新增的自动将整数时间戳转为Datetime的特性)。这是因为schema_overrides的设计是强制输入数据与目标类型严格一致,而不是自动做格式转换。
不过有几个更顺畅的替代方案,不用手动逐个列处理:
方案1:先处理非日期列的schema,再批量转换日期列
先把非日期列的类型用schema_overrides配置好,之后用str.to_datetime()批量转换所有需要的日期列——如果你的日期格式是标准ISO格式(比如YYYY-MM-DD),Polars能自动识别:
import polars as pl # 只配置非日期列的类型覆盖 schema_override = { "some_int_override": pl.Int8, } dict_data = [ { "some_int_override": 1, "some_date_override": "2020-02-11", "some_date": "2025-02-11", } ] # 先应用schema override到非日期列 df = pl.DataFrame(dict_data, schema_overrides=schema_override) # 批量转换日期列,支持同时指定多个列 df = df.with_columns( pl.col("some_date_override", "some_date").str.to_datetime() ) print(df)
方案2:自动检测所有可解析的字符串日期列
如果你不确定哪些列是日期字符串,或者想一次性处理所有符合格式的列,可以用pl.col(pl.Utf8)选中所有字符串列,配合try_parse=True参数——Polars会自动跳过无法解析为Datetime的字符串列,不会报错:
df = pl.DataFrame(dict_data, schema_overrides=schema_override) df = df.with_columns( pl.col(pl.Utf8).str.to_datetime(try_parse=True).keep_name() ) print(df)
为什么直接用schema_overrides指定pl.Datetime会报错?
因为schema_overrides的作用是强制列的类型一致性:它要求输入数据已经是目标类型(比如pl.Datetime对象),而不是自动将其他类型转换为目标类型。所以当你传入字符串时,Polars会抛出类型不匹配的错误。
关于类似整数时间戳的自动解析功能
你提到的2024年初Polars新增的“自动将整数时间戳转为Datetime”的特性,是针对Polars能直接识别的时间戳格式(比如毫秒/秒级整数)做的特殊优化,但目前还没有扩展到字符串日期的自动解析——这个需求确实合理,你可以考虑在Polars的GitHub仓库提Feature Request,说不定后续版本会支持。
最后,针对你的MRE,用上面的方案调整后就能正常运行,不用再手动删除schema里的日期键啦。
内容来源于stack exchange

