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

如何将Pandas中9999-12-31的Period类型写入Parquet的timestamp字段?

解决Pandas写入9999-12-31到Parquet的timestamp类型问题

问题根源

Pandas默认的datetime64[ns]类型范围有限(仅支持1677-09-21至2262-04-11),9999-12-31超出该范围,直接转换为timestamp会触发越界错误;而Period类型无法直接映射到Parquet的timestamp类型,导致写入时出现Not supported to convert PeriodArray to 'timestamp[us]' type报错。

可行解决方案

由于Parquet的timestamp类型支持更大范围(只要降低精度),我们可以通过以下两种方式实现需求:

方法一:将Period转换为datetime64[ms]类型后写入

通过将Period转为字符串,再解析为毫秒精度的datetime类型(datetime64[ms]),该类型支持的范围可覆盖9999-12-31,再借助PyArrow写入Parquet:

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

# 创建包含目标日期的DataFrame
df = pd.DataFrame([pd.Period('9999-12-31', 'D')], columns=['Date'])

# 将Period类型转换为datetime64[ms]
df['Date'] = pd.to_datetime(df['Date'].astype(str), dtype='datetime64[ms]')

# 转换为Arrow表并写入Parquet,指定对应精度的timestamp schema
table = pa.Table.from_pandas(df)
pq.write_table(table, 'output_date.parquet', schema=pa.schema([('Date', pa.timestamp("ms"))]))

方法二:直接用PyArrow构建timestamp数组写入

跳过Pandas的日期类型限制,直接用PyArrow处理日期字符串,构建符合要求的timestamp数组后写入Parquet:

import pyarrow as pa
import pyarrow.parquet as pq

# 直接使用日期字符串构建数据
date_data = ['9999-12-31']
# 解析为毫秒精度的timestamp类型(默认补充00:00:00时间部分)
date_array = pa.array(date_data, type=pa.timestamp('ms'))
# 构建Arrow表并写入
table = pa.Table.from_arrays([date_array], names=['Date'])
pq.write_table(table, 'output_date.parquet')

验证写入结果

可以通过PyArrow读取文件验证:

read_table = pq.read_table('output_date.parquet')
print(read_table.to_pandas())
# 输出:
#         Date
# 0 9999-12-31

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:22:42