Pandas转Parquet时Datetime列格式异常且值失真求助
解决Parquet保存后日期格式异常问题
问题现象
把CSV里的日期列(%Y-%m-%d格式,比如2011-01-29)转成datetime类型后,数据显示完全正常,但保存为Parquet文件后,日期却变成了43060-07-05.03:00:00.000这类异常的大年份格式。
可能原因
- 读取工具不兼容:直接用Excel这类不原生支持Parquet的工具打开文件时,Excel会把Parquet里存储的
datetime二进制数据误判为Excel的日期序列号(以1900年为起始的日计数),进而转换出错误的大年份日期。 - 非标准工具读取时的解析错误:如果用了非pandas的工具读取Parquet,可能没有正确识别文件里的
timestamp类型。
解决方案
1. 用正确工具验证Parquet文件内容
先通过pandas重新读取Parquet,确认数据本身是否真的异常:
import pandas as pd # 读取Parquet文件 df_read = pd.read_parquet("merged1.parquet", engine="pyarrow") # 检查日期列的类型和内容 print("日期列数据类型:", df_read["date"].dtype) print("日期列前5行内容:") print(df_read["date"].head())
如果输出的日期是正常的%Y-%m-%d格式,说明问题出在读取工具而非保存过程。
2. 确保保存时的datetime类型正确
转换日期列后,先确认它的类型是datetime64[ns](无需带时区):
# 转换后检查数据类型 print(df_merged_CA["date"].dtype) # 正常输出应为 datetime64[ns]
确认类型正确后,直接保存即可,没必要额外添加时区(添加时区反而可能导致部分工具解析异常):
df_merged_CA.to_parquet("merged1.parquet", compression="gzip", engine="pyarrow")
3. 若需兼容Excel读取(可选)
如果必须用Excel查看日期,可以把datetime列转成字符串格式后再保存(但会丢失datetime类型的运算优势):
df_merged_CA["date_str"] = df_merged_CA["date"].dt.strftime("%Y-%m-%d") df_merged_CA.to_parquet("merged1_with_str_date.parquet", compression="gzip", engine="pyarrow")
内容的提问来源于stack exchange,提问作者miraakbutnotded
相关产品推荐
相关产品推荐

