使用PyArrow 11.0.0读取Parquet时如何保留timestamp[us]避免越界错误?
解决PyArrow转Pandas时Timestamp单位转换溢出问题
错误原因
你遇到的ArrowInvalid错误,是因为Parquet文件中存储的timestamp[us]时间戳,在转成Pandas默认的datetime64[ns]类型时超出了范围。Pandas的datetime64[ns]依赖int64存储,能表示的时间上限是2262年,而你数据里的101999952000000000微秒对应3228年,转成纳秒后数值超出int64的存储范围,导致溢出报错。
解决方案
方案1:保留原生Timestamp单位转Pandas
在调用to_pandas()时传入use_pyarrow_extension_types=True参数,让Pandas保留PyArrow的原生时间类型(以扩展类型形式存在),避免强制转换为datetime64[ns]:
import pyarrow.parquet as pq import pandas as pd # 读取Parquet并保留原生时间类型 table = pq.read_table('/Users/abc/Downloads/LOAD.parquet').to_pandas(use_pyarrow_extension_types=True) print(len(table))
处理后,DataFrame中的时间列会是pyarrow.TimestampType(unit='us')类型,既不会触发溢出,也能兼容大部分Pandas操作。
方案2:直接用PyArrow统计行数(更高效)
如果你的需求只是统计记录数,完全不需要转成Pandas,直接使用PyArrow Table的num_rows属性即可,跳过类型转换环节:
import pyarrow.parquet as pq # 读取为PyArrow Table后直接统计行数 table = pq.read_table('/Users/abc/Downloads/LOAD.parquet') print(table.num_rows)
这个方法不仅避免了类型转换问题,处理大文件时速度也会快很多。
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

