使用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
相关产品推荐
相关产品推荐

