为何无法用Pandas的read_parquet函数读取Parquet文件?
解决Parquet读取时的Timestamp溢出错误并转CSV
错误原因
你遇到的ArrowInvalid错误是因为Parquet文件中存储的某个时间戳(32094334800000000微秒)转换为pandas默认的纳秒级时间戳时,超出了pandas支持的时间范围(pandas的Timestamp最大只能表示到2262年4月11日,而该微秒时间对应2987年,超出了上限)。
解决方案
下面提供三种可行的处理方式,帮你读取文件并转换为CSV:
方法1:用PyArrow读取并保留微秒时间单位
直接使用PyArrow库读取文件,避免自动转换为纳秒时间戳,再转成DataFrame保存为CSV:
import pyarrow.parquet as pq import pandas as pd # 读取Parquet文件 table = pq.read_table("fhv_tripdata_2018-05.parquet") # 转换为DataFrame,保持原时间单位(微秒) df = table.to_pandas(timestamp_as_object=False) # 保存为CSV df.to_csv("fhv_tripdata_2018-05.csv", index=False)
方法2:过滤超出范围的异常时间戳
如果你不需要异常的时间数据,可以先读取时转换为可处理的格式,再过滤掉超出范围的行:
import pandas as pd # 读取文件时使用PyArrow引擎,指定dtype后端为PyArrow以支持更大时间范围 df = pd.read_parquet("fhv_tripdata_2018-05.parquet", engine="pyarrow", dtype_backend="pyarrow") # 过滤掉超出pandas时间范围的行(假设异常时间在pickup_datetime和dropoff_datetime列) valid_min = pd.Timestamp.min valid_max = pd.Timestamp.max df = df[(df["pickup_datetime"].between(valid_min, valid_max)) & (df["dropoff_datetime"].between(valid_min, valid_max))] # 保存为CSV df.to_csv("fhv_tripdata_2018-05.csv", index=False)
方法3:强制将时间列转为字符串(简单粗暴)
如果不需要对时间列做计算,直接转成字符串读取:
import pandas as pd # 读取时指定时间列为字符串类型 df = pd.read_parquet("fhv_tripdata_2018-05.parquet", dtype={"pickup_datetime": str, "dropoff_datetime": str}) # 保存为CSV df.to_csv("fhv_tripdata_2018-05.csv", index=False)
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

