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

