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

Polars读取Parquet时无效日期被转换,如何保留原日期?

问题:读取Parquet时保留无效日期值(年份0200)

问题详情

  • 使用Polars读取S3存储桶中的Parquet文件,代码如下:
    df = pl.read_parquet(parquet_file_name, storage_options=storage_options, hive_partitioning=False)
    
  • 原Parquet文件中存在无效日期值:start_date = 0200-03-01 00:00:00
  • 读取后该日期被自动转换为:start_date = 1953-10-28 10:43:41.128654848,列数据类型为Datetime(time_unit='ns', time_zone=None)
  • Pandas读取该文件时也出现相同问题,后续类型转换无法恢复原始无效日期值

解决方法

1. 读取时指定日期列为字符串类型

利用Polars read_parquet的dtypes参数,直接将目标日期列指定为字符串类型,跳过自动日期解析,从而保留原始值:

df = pl.read_parquet(
    parquet_file_name,
    storage_options=storage_options,
    hive_partitioning=False,
    dtypes={"start_date": pl.String}
)

读取后start_date列会保留0200-03-01 00:00:00的原始字符串格式,可后续根据需求做自定义处理(如标记无效日期、转换为支持宽范围日期的类型等)。

2. 区分有效/无效日期做针对性处理

如果需要将有效日期转为Datetime类型,同时保留无效日期的原始值,可以在读取字符串后添加判断逻辑:

df = df.with_columns(
    pl.when(pl.col("start_date").str.match(r"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$"))
      .then(pl.col("start_date").str.to_datetime())
      .otherwise(pl.col("start_date"))
      .alias("start_date")
)

此方法会将符合格式的有效日期转为Datetime类型,不符合的(如年份0200)则保留原始字符串。

3. 检查并调整Parquet写入逻辑(若有权限)

若该Parquet文件是由己方系统写入,可在写入时将这类无效日期以字符串格式存储,而非Datetime类型,从源头避免解析溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:47:51