pandas导出Timestamp索引DataFrame为json后转换日期报OverflowError如何解决
问题根因
pandas的to_json方法默认会将Timestamp类型的索引转换为毫秒级Unix时间戳(13位整数),你转换报错的核心原因有两个:
datetime.datetime.fromtimestamp仅接收秒级Unix时间戳(10位整数),传入13位毫秒值会因为数值范围远超C long类型上限,触发*OverflowError: Python int too large to convert to C long*报错- 直接调用
pd.to_datetime时如果不指定单位,默认会按秒解析13位数值,得到超出合理时间范围的结果,甚至报错
可用解决方案
方案1:导出阶段直接规避时间戳格式问题
导出时指定date_format参数为iso,直接输出标准ISO格式的日期字符串,后续读回无需额外处理即可识别为时间类型:
# 导出时指定ISO日期格式 df.to_json("data.json", date_format="iso") # 读回JSON时会自动识别日期格式 df_new = pd.read_json("data.json")
方案2:对已有的毫秒时间戳索引做转换
如果已经生成了带13位时间戳的JSON文件,读回后给pd.to_datetime指定unit='ms'参数即可完成转换,不需要手动做除法运算:
# 读回JSON文件 df_new = pd.read_json("data.json") # 转换索引为Timestamp类型,指定单位为毫秒 df_new.index = pd.to_datetime(df_new.index, unit="ms")
方案3:单独转换单个毫秒时间戳
如果需要单独处理单个13位时间戳,先除以1000转换为秒级时间戳,再用datetime方法处理:
import datetime ms_ts = 1629849600000 dt_obj = datetime.datetime.fromtimestamp(ms_ts / 1000)
内容的提问来源于stack exchange,提问作者jason m
相关产品推荐
相关产品推荐

