
在 Polars 中定义 Schema 时,pl.Datetime 必须显式调用(如 pl.Datetime())以提供完整类型规格,不能直接使用类名 pl.Datetime,否则会触发“dtypes must be fully-specified”错误。
在 polars 中定义 schema 时,`pl.datetime` 必须显式调用(如 `pl.datetime()`)以提供完整类型规格,不能直接使用类名 `pl.datetime`,否则会触发“dtypes must be fully-specified”错误。
Polars 对数据类型的校验非常严格:所有 Schema 中的 dtype 必须是已实例化的具体类型对象,而非未调用的类型类本身。这一点与 pl.Int64、pl.Utf8 等标量类型不同——后者是单例(singleton)或直接可作为 dtype 使用的常量,而 pl.Datetime 是一个需参数化配置的类型构造器(class),其签名如下:
class polars.datatypes.Datetime(
time_unit: TimeUnit = "us",
time_zone: str | timezone | None = None
)
因此,pl.Datetime 本身只是一个类型类,只有调用它(如 pl.Datetime())才会生成一个符合 Schema 要求的、完全指定的 dtype 实例。省略括号会导致传入的是类引用,Polars 内部校验失败并抛出 TypeError: dtypes must be fully-specified, got: Datetime。
✅ 正确写法(推荐使用默认参数):
import polars as pl
testing_schema: pl.Schema = pl.Schema({
"date": pl.Datetime(), # ✅ us 精度,无时区(最常用)
"some_int": pl.Int64, # ✅ 标量类型可直接使用
"some_str": pl.Utf8,
"some_cost": pl.Float64,
})
✅ 进阶写法(自定义精度与时区):
schema_with_tz = pl.Schema({
"event_time": pl.Datetime(time_unit="ns", time_zone="UTC"),
"log_time": pl.Datetime(time_unit="ms"), # 毫秒精度,无时区
})
⚠️ 注意事项:
-
pl.Datetime()默认time_unit="us"(微秒)、time_zone=None;若后续 DataFrame 中该列含时区信息,建议显式声明time_zone以确保类型一致性; - 所有
pl.Duration、pl.Date(注意:pl.Date是标量类型,无需括号)等需区分——pl.Date可直接使用,但pl.Datetime和pl.Duration均需调用; - 在
pl.DataFrame(..., schema=...)或pl.read_*(..., schema=...)中使用该 Schema 时,类型校验将严格按此执行,避免运行时隐式转换异常。
总结:牢记口诀——“Datetime 要加括号,Int64 Utf8 不用括”。只要确保每个 dtype 都是已实例化的对象,Schema 定义即可通过校验,为数据加载与转换提供强类型保障。










