FBProphet时间范围异常:结果起始出现1970年数据
解决FBProphet图表出现1970年日期的问题
嘿,我来帮你搞定这个问题!你遇到的1970年日期乱入的情况,大概率是日期列没有被正确解析为datetime类型导致的——Prophet会把非datetime格式的日期当成Unix时间戳数值来处理,而Unix纪元起始就是1970年1月1日,所以才会出现那些奇怪的早期日期。下面是具体的排查和解决步骤:
1. 先确认日期列的解析问题
首先,你需要确保读取CSV时把日期列转换成pandas的datetime类型,而且Prophet要求输入数据必须包含ds(日期)和y(预测目标值)两列(列名要准确)。
修改你的数据读取代码,指定解析日期列:
# 假设你的日期列名为'ds',如果不是,替换成你实际的列名 df = pd.read_csv('sp18.csv', parse_dates=['ds']) # 验证一下日期是否正确解析 print("数据最早日期:", df['ds'].min()) print("数据最早几行日期:") print(df['ds'].head())
如果输出的最早日期还是1970年,那说明你的CSV里日期格式可能有问题,比如是字符串格式但不符合标准(比如DD/MM/YYYY和MM/DD/YYYY混淆),这时候可以手动指定日期格式:
df['ds'] = pd.to_datetime(df['ds'], format='%Y-%m-%d') # 替换成你实际的日期格式,比如'%d/%m/%Y'
2. 确保预测范围符合要求
当日期列正确解析后,接下来要控制预测的时间范围在2016-2021年:
- 首先生成未来日期时,直接指定到2021年年底
- 绘制图表时,手动限制x轴的范围,避免显示多余日期
完整的修正代码示例:
%matplotlib inline import pandas as pd from fbprophet import Prophet import matplotlib.pyplot as plt plt.style.use('fivethirtyeight') # 读取并解析数据,确保列名符合Prophet要求(ds=日期,y=目标值) df = pd.read_csv('sp18.csv', parse_dates=['ds']) # 如果你的列名不是ds/y,记得重命名: # df.rename(columns={'原日期列': 'ds', '原目标列': 'y'}, inplace=True) # 初始化并训练模型 model = Prophet() model.fit(df) # 生成到2021年12月31日的未来日期 end_date = '2021-12-31' # 计算从数据最后一天到结束日期的天数 periods = (pd.to_datetime(end_date) - df['ds'].max()).days future = model.make_future_dataframe(periods=periods) # 执行预测 forecast = model.predict(future) # 绘制图表并限制x轴范围 fig = model.plot(forecast) plt.xlim(pd.to_datetime('2016-01-01'), pd.to_datetime('2021-12-31')) plt.title('2016-2021年预测结果') plt.show()
额外检查点
- 确认你的数据集中没有空值或者格式错误的日期行,可以用
df['ds'].isnull().sum()查看空值数量 - 如果还是有问题,检查一下
forecast数据框里的ds列,看看是不是包含了1970年的日期,这时候就要回溯到原始数据的日期解析环节
内容的提问来源于stack exchange,提问作者Jil W
相关产品推荐
相关产品推荐

