如何解决Python中Out of bounds nanosecond timestamp:3026-06-30错误?
问题描述
我有一个仅包含datetime类型列(Quarter)的DataFrame,在使用带外生变量的SARIMAX模型后,调用以下自定义函数绘制时间序列图:
def eval_model(model,tr,tst,exog_tst,exog_tr,name='Model',lags=4): lb = np.mean(sm.stats.acorr_ljungbox(model.resid, lags=lags, return_df=True).lb_pvalue) pred = model.forecast(steps=len(tst)) fig1, ax = plt.subplots() ax.plot(tr, label='training') ax.plot(tst, label='test') ax.plot(pred, label='prediction') plt.legend(loc='upper left') tit = name + ": LjungBox p-value --> " + str(lb) + "\n MAPE: " + str(round(mean_absolute_percentage_error(tst, pred)*100,2)) + "%" plt.title(tit) plt.ylabel('Pasajeros') plt.xlabel('Date') plt.show() print(lb) eval_model(model,tr,tst,exog_tr=exog_tr, exog_tst=exog_tst, name='Model',lags=4)
运行后出现Python错误:Out of bounds nanosecond timestamp: 3026-06-30 00:00:00。我检查过Quarter列的唯一值(无异常日期),转换datetime类型时使用errors='coerce'也无效,请问该如何修复这个错误?
解决方案
这个错误的核心原因是SARIMAX生成的预测结果没有关联测试集的时间索引,导致matplotlib尝试绘制超出numpy datetime64[ns]范围的日期(该类型支持的最大日期为2262-04-11)。以下是具体修复方法:
为预测结果绑定测试集的时间索引
在调用model.forecast()时传入外生变量,并将预测值的索引设置为测试集tst的索引,确保绘图时日期对应正确:pred = model.forecast(steps=len(tst), exog=exog_tst) pred.index = tst.index # 关键步骤:关联测试集时间索引检查训练/测试集的索引连续性
确认训练集tr和测试集tst是按时间顺序正确分割的,索引无断层或混乱,避免模型预测时错误推断日期范围。验证日期的有效范围
显式检查Quarter列的日期是否在datetime64[ns]的有效区间内:df['Quarter'] = pd.to_datetime(df['Quarter'], errors='coerce') # 输出日期范围确认 print(f"日期范围:{df['Quarter'].min()} 至 {df['Quarter'].max()}")若存在超出
1677-09-21到2262-04-11的日期,需修正原始数据的日期格式。
内容的提问来源于stack exchange,提问作者GiuliaS
相关产品推荐
相关产品推荐

