You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:24:21