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

使用Scipy UnivariateSpline处理时间序列数据报类型错误如何解决

报错原因

scipy.interpolate.UnivariateSpline 仅支持数值类型的输入参数,无法直接识别datetime64[ns]格式的时间对象,传入时会触发类型转换错误。

修复方案

核心处理逻辑是将时间序列转换为纯数值格式传入拟合函数,拟合完成后再将数值映射回时间格式即可。注意样条插值要求x轴序列严格单调递增,处理前必须先按时间排序。

  • 第一步:按datetime列对DataFrame做升序排序,重置索引避免索引混乱
  • 第二步:选数据集中的最早时间作为基准点,将每条数据的时间转换为距基准点的秒数(或毫秒数,根据时间精度需求选择),得到纯数值的x轴序列
  • 第三步:将数值x和value列的y传入UnivariateSpline完成拟合,调整s参数控制平滑强度:s越大平滑效果越强,s=0时曲线会完全经过所有原始点
  • 第四步:生成平滑后的数值x序列,计算对应的平滑y值,再将数值x转换回datetime格式即可用于后续绘图或分析
修正后可运行代码
import pandas as pd
import numpy as np
from scipy.interpolate import UnivariateSpline

d = {'datetime': ['08/07/2022  00:02:03.000','08/07/2022  00:15:06.050','08/07/2022  00:30:06.369','08/07/2022  00:31:03.025','08/07/2022  00:35:08.369','08/07/2022  00:37:59.258','08/07/2022  00:45:06.258','08/07/2022  00:45:25.025','08/07/2022  00:49:15.326','08/07/2022  00:51:45.058','08/07/2022  00:33:09.258'], 'value': [10,10.5,10.3,10.8,10.5,10.6,10.9,10.33,10.35,10.36,10.37]}

df = pd.DataFrame(data=d)
df['datetime'] = pd.to_datetime(df['datetime'])
# 按时间升序排序,满足样条函数对x单调递增的要求
df = df.sort_values('datetime').reset_index(drop=True)

# 时间转数值:取最早时间为基准,计算每条记录距基准点的秒数
start_ts = df['datetime'].min()
x = (df['datetime'] - start_ts).dt.total_seconds().values
y = df['value'].values

# 拟合一元样条,s参数按需调整平滑度
spl = UnivariateSpline(x, y, s=0.5)

# 生成平滑后的序列
x_smooth_num = np.linspace(x.min(), x.max(), 100)
y_smooth = spl(x_smooth_num)
# 数值转回时间格式
x_smooth_ts = start_ts + pd.to_timedelta(x_smooth_num, unit='s')

提示:示例数据中存在时间乱序的记录,跳过排序步骤即使完成时间转数值,也会触发「x must be strictly increasing」的报错。

内容的提问来源于stack exchange,提问作者VSP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:24:25