Pandas写入Parquet后日期显示异常(Synapse查询呈Epoch时间)
解决Pandas写入Parquet后Synapse日期显示为Epoch时间的问题
核心原因
源Parquet文件1的日期列是**date类型**(仅日期,无时间部分),而Pandas默认将datetime64[ns]类型列写入为**timestamp[ns]类型**的Parquet字段,Synapse无服务器SQL对这两种类型的解析逻辑不同,导致显示为Epoch时间戳。
解决方案
要让文件2的日期存储格式与文件1一致,需要将日期列转换为date类型后写入Parquet,具体步骤如下:
转换日期列类型
将DataFrame中的datetime64[ns]日期列转换为纯日期类型(去掉时间部分):# 替换成你的实际日期列名 df['date_column'] = df['date_column'].dt.date用PyArrow引擎写入Parquet
确保使用PyArrow引擎写入,此时Pandas会将date类型列映射为Parquet的date类型:df.to_parquet("file2.parquet", engine='pyarrow')
更稳妥的方式(指定Schema)
如果需要严格匹配源文件的Schema,可以手动定义PyArrow Schema后写入,避免类型自动转换偏差:
import pyarrow as pa import pyarrow.parquet as pq # 定义Schema,指定日期列为date32类型(对应yyyy-MM-dd格式) schema = pa.schema([ ('date_column', pa.date32()), # 其他列按实际数据类型补充,例如: # ('string_col', pa.string()), # ('int_col', pa.int64()) ]) # 将DataFrame转为PyArrow Table并写入 table = pa.Table.from_pandas(df, schema=schema) pq.write_table(table, "file2.parquet")
验证结果
写入完成后,用Synapse无服务器SQL查询文件2,日期列会显示为yyyy-MM-dd格式,与源文件1一致;若需要带T00:00:00,可以在查询时用FORMAT(date_column, 'yyyy-MM-ddTHH:mm:ss')做格式转换,或者保持date类型不变(Synapse默认显示纯日期)。
内容的提问来源于stack exchange,提问作者fr0do007
相关产品推荐
相关产品推荐

