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

Python读写Parquet文件时保留DATE数据类型的问题求助

保留Parquet文件中的DATE数据类型解决方案

要解决Parquet转换后DATE类型丢失的问题,核心是在写入时明确指定数据类型schema,确保Parquet文件正确识别DATE类型。以下是具体实现步骤:

1. 准备带DATE类型的测试数据

生成测试数据时,要确保日期列的类型能被正确映射为Parquet的DATE类型,避免直接存为字符串或未指定类型的datetime:

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

# 生成测试数据,将日期转换为datetime后提取date部分
df = pd.DataFrame({
    'user_id': [101, 102, 103],
    'register_date': pd.to_datetime(['2024-01-01', '2024-02-15', '2024-03-20']).date
})

2. 定义Parquet Schema并写入文件

使用PyArrow定义明确的schema,将日期列指定为pa.date()类型,写入时应用该schema,确保Parquet文件保留DATE类型:

# 定义schema,明确register_date为DATE类型
parquet_schema = pa.schema([
    ('user_id', pa.int64()),
    ('register_date', pa.date())
])

# 将DataFrame转换为PyArrow Table并应用schema
table = pa.Table.from_pandas(df, schema=parquet_schema)

# 写入Parquet文件
pq.write_table(table, 'user_data.parquet')

如果习惯用Pandas直接写入,也可以指定engine为pyarrow并传入schema:

df.to_parquet('user_data.parquet', engine='pyarrow', schema=parquet_schema)

3. 读取并验证DATE类型

读取Parquet文件后,可验证数据类型是否保留:

# 读取Parquet文件
read_table = pq.read_table('user_data.parquet')
read_df = read_table.to_pandas()

# 查看读取后的数据类型(PyArrow的DATE类型会转为Pandas的datetime64[ns])
print(read_df.dtypes)
# 输出:
# user_id           int64
# register_date    datetime64[ns]
# dtype: object

# 若需要转为Python原生date对象,可进一步转换:
read_df['register_date'] = read_df['register_date'].dt.date
print(read_df.dtypes)
# 输出:
# user_id           int64
# register_date     object
# dtype: object

关键注意事项

  • 避免直接将Python原生date对象(Pandas中为object类型)写入Parquet,否则会被默认转为字符串类型
  • 必须使用PyArrow或FastParquet引擎(不推荐默认的auto),并明确指定schema才能保证DATE类型的正确存储
  • Parquet文件本身的DATE类型在Pandas中会被映射为datetime64[ns],若需要原生date对象可手动转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:42:26