Pandas调用to_parquet保存parquet文件时报ArrowTypeError如何处理
报错原因
ArrowTypeError: ("Expected bytes, got a 'float' object", 'Conversion failed for column Pre-Rumour_Date with type object')
该报错核心是:被标记为object类型的Pre-Rumour_Date列中同时存在字符串类型的日期值和NaN空值,而pandas中的NaN本质为float类型。parquet默认使用的Arrow转换引擎推断object类型列应该全为字节/字符串,遇到float类型的NaN就会转换失败。
此外你当前所有日期类字段均为object类型,没有做统一类型转换,后续其他日期列也可能触发同款报错。
解决方法
方案1:将所有日期类字段统一转换为datetime类型(推荐)
既符合字段本身的语义,也能避免类型混乱,空值会被统一识别为NaT(datetime类型专属空值),Arrow可以正常识别转换。
import pandas as pd # 批量把所有日期类列转换为datetime类型,errors='coerce'会把无法解析的内容转为NaT空值 date_cols = ['Announced_Date', 'Completed_Date', 'Pre-Rumour_Date', 'Lapsed_Date'] for col in date_cols: df[col] = pd.to_datetime(df[col], errors='coerce') # 转换完成后再保存parquet LABL = datetime.now().strftime("%Y%m%d_%H%M%S") df.to_parquet("/data/TargetData_Raw_{}.parquet".format(LABL))
方案2:替换object列空值为字符串类型占位符
如果你需要保留这些列为字符串类型,可以把列中的NaN替换为空字符串或其他自定义占位符,消除float类型的空值:
# 仅处理报错的Pre-Rumour_Date列 df['Pre-Rumour_Date'] = df['Pre-Rumour_Date'].fillna('') # 也可以批量处理所有object类型列,覆盖你输出中那个无列名的object列 obj_cols = df.select_dtypes(include='object').columns df[obj_cols] = df[obj_cols].fillna('') # 再执行保存操作 LABL = datetime.now().strftime("%Y%m%d_%H%M%S") df.to_parquet("/data/TargetData_Raw_{}.parquet".format(LABL))
方案3:切换parquet存储引擎(临时兼容方案)
如果不想修改原始数据,可以把存储引擎从默认的arrow换成fastparquet,该引擎对object列混合类型的兼容度更高。
使用前需要先安装依赖:pip install fastparquet
LABL = datetime.now().strftime("%Y%m%d_%H%M%S") df.to_parquet("/data/TargetData_Raw_{}.parquet".format(LABL), engine='fastparquet')
内容的提问来源于stack exchange,提问作者delalma
相关产品推荐
相关产品推荐

