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

