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

Polars DataFrame写入MS SQL日期格式报错,求纯Polars解决方案

解决Polars写入MS SQL时的日期类型报错问题

问题背景

使用Polars从MS SQL读取数据并转换后,执行写入另一个MS SQL数据库操作时出现报错:

NotImplementedError: dt.tz is not supported for date32[day][pyarrow]

转为Pandas DataFrame后可正常写入,但用Polars的apply转换日期类型会生成多余时间戳,需要纯Polars解决方案。

纯Polars解决方案

方法1:转换为Polars原生Date类型(无时间戳)

原报错源于PyArrow的date32[day]类型与MS SQL驱动的兼容性问题,将日期列转换为Polars原生pl.Date类型即可解决:

# 转换日期列类型
polar_df = polar_df.with_columns(
    pl.col("DATE").cast(pl.Date)
)

# 执行写入
polar_df.write_database(table_name="Table1", connection_uri=mssql_db2, if_exists='replace')

如果原列已是pl.Date但基于PyArrow后端,可通过字符串中转强制使用Polars原生实现:

polar_df = polar_df.with_columns(
    pl.col("DATE").dt.to_string("%Y-%m-%d").str.to_date()
)

方法2:转换为无时区的Datetime类型(自动映射MS SQL DATE)

若方法1仍有问题,可将日期列转换为无时区的pl.Datetime类型,写入时MS SQL会自动识别为DATE类型,不会保留时间戳:

polar_df = polar_df.with_columns(
    pl.col("DATE").cast(pl.Datetime(time_unit="ns", time_zone=None))
)

polar_df.write_database(table_name="Table1", connection_uri=mssql_db2, if_exists='replace')

方法3:读取时直接指定日期类型(从源头规避)

在读取源数据库时,直接指定日期列的类型为Polars原生pl.Date,跳过PyArrow的date32类型:

polar_df = pl.read_database(
    query,
    mssql_db1,
    partition_num=5,
    dtype={"DATE": pl.Date}
)
# 后续转换及写入操作不变

内容的提问来源于stack exchange,提问作者kata1000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:52:35