无date_time字段时如何从非等间隔数据推断逐小时时间序列
问题解答
你需要从离散不等间隔的试验观测点得到逐小时对应的数值,本质是一维插值问题,不建议直接使用全局线性回归,首选分段线性插值,具体说明如下:
方案选型说明
- 不推荐全局线性回归的原因:从你给出的样例数据就能看出,不同阶段Value随时间的变化速率差异很大:2.56小时到4.43小时之间每小时Value约增长0.075,4.43小时到10.12小时之间每小时Value约增长0.346。全局线性回归会强制给整个试验周期拟合一个固定斜率的直线,完全忽略局部变化规律,结果误差会非常大。只有当你通过试验机理确认Value和时间全程呈严格线性关系时,才适合用全局线性回归。
- 首选分段线性插值:这是这类无特殊业务规则的试验数据最通用的处理方案,逻辑是默认相邻两个观测点之间Value随时间线性变化,没有额外的模型假设,可解释性强、计算简单,结果完全满足逐小时取值的需求。
- 备选三次样条插值:如果你观测的指标是温度、浓度这类不会发生突变的连续平滑量,可以换用三次样条插值,得到的逐小时数值过渡会更自然,不会出现折线拐点。
具体实现方式
直接用pandas内置的插值接口即可完成,不需要额外复杂建模,代码如下:
import pandas as pd import numpy as np # 原始观测数据 df = pd.DataFrame({ 'Value': [0.32, 0.46, 2.43], 'Interval': [2.56, 4.43, 10.12] }) # 生成需要输出的逐小时时间点(从0小时到试验结束的最大小时数) max_hour = int(np.ceil(df['Interval'].max())) hourly_ticks = pd.Index(np.arange(0, max_hour + 1), name='Interval') # 合并原始观测点和逐小时目标点,按时间排序 df_interp = df.set_index('Interval').reindex(hourly_ticks.union(df['Interval'])).sort_index() # 执行插值,要换三次样条可以把method改为'spline', order=3 df_interp['Value'] = df_interp['Value'].interpolate(method='linear') # 筛选得到逐小时对应的结果 hourly_result = df_interp.loc[hourly_ticks].reset_index()
注意事项
你目前的原始数据缺少试验初始时刻(0小时)的观测值,小于2.56小时的0、1、2小时位置没有左边界观测点支撑,直接插值的结果误差会很大,建议补充0小时的初始Value后再计算,结果会更可靠。
以你给出的样例数据做线性插值,几个关键节点的参考结果如下:
| Interval(试验开始后小时数) | 插值得到的Value |
|---|---|
| 3 | ≈0.35 |
| 4 | ≈0.43 |
| 5 | ≈0.66 |
| 10 | ≈2.38 |
内容的提问来源于stack exchange,提问作者kittycat
相关产品推荐
相关产品推荐

