使用pickle加载含pandas Timestamp的文件时触发TypeError求助
解决Pickle加载含Pandas Timestamp对象时报错的问题
问题重现
用原生pickle保存嵌套字典(内含Pandas Timestamp对象):
pickle.dump(doublesplit_list, open("doublesplit_list.p", "wb"))
加载时触发错误:
doublesplit_list = pickle.load(open('doublesplit_list.p', 'rb'))
报错信息:
TypeError Traceback (most recent call last) Input In [22], in <cell line: 1>() ----> 1 doublesplit_list = pickle.load(open('doublesplit_list.p', 'rb')) File D:\Porgrams\Conda\lib\site-packages\pandas\_libs\tslibs\timestamps.pyx:132, in pandas._libs.tslibs.timestamps._unpickle_timestamp() TypeError: _unpickle_timestamp() takes exactly 3 positional arguments (4 given)
原因
核心问题是Pandas版本不兼容:保存pickle文件时的Pandas版本,与加载时的版本对Timestamp对象的序列化格式定义不同,导致反序列化时参数数量不匹配。
解决方法
方法1:对齐版本并转存兼容格式
- 安装保存文件时使用的Pandas版本:
pip install pandas==x.x.x # 替换x.x.x为保存时的具体版本号
- 加载原文件后用Pandas官方方法转存:
import pickle import pandas as pd # 加载原pickle文件 doublesplit_list = pickle.load(open('doublesplit_list.p', 'rb')) # 用Pandas自带方法转存,提升跨版本兼容性 pd.to_pickle(doublesplit_list, 'doublesplit_list_compatible.p')
- 切换回当前版本后,用官方方法加载:
doublesplit_list = pd.read_pickle('doublesplit_list_compatible.p')
方法2:自定义反序列化钩子(临时应急)
如果无法回退版本,可通过覆盖Pandas的反序列化函数忽略多余参数:
import pickle import pandas._libs.tslibs.timestamps from pandas._libs.tslibs.timestamps import Timestamp def custom_unpickle_timestamp(year, month, day, *args): # 仅保留必要的三个参数,忽略多余参数 return Timestamp(year=year, month=month, day=day) # 替换原反序列化函数 pandas._libs.tslibs.timestamps._unpickle_timestamp = custom_unpickle_timestamp # 加载文件 doublesplit_list = pickle.load(open('doublesplit_list.p', 'rb'))
注意:该方法依赖Pandas内部实现,可能随版本更新失效,仅作临时修复。
方法3:避免未来出现同类问题
- 优先使用Pandas官方的
pd.to_pickle()和pd.read_pickle()处理含Pandas对象的数据,而非原生pickle,官方实现更适配Pandas数据结构的版本变化。 - 若需长期存储,推荐使用Parquet等跨版本兼容的格式,同时支持复杂嵌套结构;时间序列数据也可导出为CSV(需注意时间格式转换)。
内容的提问来源于stack exchange,提问作者KirGear
相关产品推荐
相关产品推荐

