使用np.polyfit处理日期序列报类型错误的解决方案
错误原因
np.polyfit 仅支持数值类型的输入参数,代码中传入的date是datetime64[ns]类型的时间对象,无法直接与浮点型数值参与拟合过程的算术运算,因此触发类型不匹配错误。
解决方案
核心是将日期序列转换为可参与算术计算的数值格式,以下是两种常用的转换方式:
方式1:转换为数值型时间戳
直接将datetime类型转换为对应纳秒级Unix时间戳的浮点数值,即可直接传入polyfit计算:
import numpy as np import pandas as pd data1 = np.array(['1801-01-01', '1802-01-01', '1803-01-01', '1804-01-01', '1805-01-01']) data2 = np.array([5, 6, 7, 8, 9]) ser1 = pd.Series(data1) ser2 = pd.Series(data2) date = pd.to_datetime(ser1) # 日期转浮点型时间戳 date_numeric = date.astype("int64").astype("float64") a, b = np.polyfit(date_numeric, ser2, 1)
注意:该方式得到的斜率单位为「y值单位/纳秒」,数值会非常小,适合需要高精度时间计算的场景。
方式2:转换为相对时间差数值
对于固定间隔的时间序列,将日期转换为距离起始点的时间差数值,拟合得到的参数可读性更强:
# 计算每个日期距离序列首个日期的天数,转为浮点数 date_numeric = (date - date.iloc[0]).dt.days.astype("float64") a, b = np.polyfit(date_numeric, ser2, 1)
如果时间序列间隔完全相等(比如示例中均为间隔1个月的月度数据),也可以直接用序列索引作为x轴输入:
date_numeric = np.arange(len(ser2), dtype="float64") a, b = np.polyfit(date_numeric, ser2, 1)
该方式得到的斜率直接对应单位时间间隔(天/月/自定义步长)下y值的变化量,更适合常规时序拟合场景。
注意事项
- 所有numpy数值计算函数都无法直接处理datetime类型对象,涉及时间的算术运算都需要先做数值转换
- 拟合完成后做预测时,新的日期输入必须使用和训练阶段完全一致的规则转换为数值,计算完成后可按转换规则反向映射回日期格式
内容的提问来源于stack exchange,提问作者Ahmed Shawky
相关产品推荐
相关产品推荐

