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
相关产品推荐
相关产品推荐

