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

Python如何基于历史行为规律实现时序温度数据插值修复

时序温度数据异常值修正问题

问题描述

  • 现有按时间维度记录温度的DataFrame,原始数据样式:
    原始温度数据样例
  • 前期数天因监测故障,温度记录异常显示为0,对应时序图效果:
    含异常0值的时序图
  • 已将异常0值替换为NaN,调用interpolate方法并指定method = time做插值后,结果不符合预期,插值效果:
    time方法插值效果
  • 需求:实现自定义插值或等效方案,基于数据历史变化规律修正异常数据。

解决方案

普通method='time'插值本质是基于缺失段前后两个端点做线性拟合,完全没有利用温度数据强日周期性的特征,跨越多天的缺失段自然会生成不符合日常温度波动规律的平直斜线,以下三种方案可按数据场景选择:

方案1:同期历史均值填充(实现成本最低,适配短故障段场景)

温度的日周期规律极强,同一时刻的温度在连续数天内波动范围很小,适合故障时长在7天以内、没有剧烈天气变化的场景:

  • 先为每条数据生成「月-日 时:分」的时刻匹配标签,排除异常值后计算每个时刻的历史滚动均值,用均值直接填充缺失段
  • 参考实现代码:
import pandas as pd
import numpy as np

# 前提:df的索引为datetime类型,温度列名为temperature
df['time_tag'] = df.index.strftime("%m-%d %H:%M")
# 替换异常0值为NaN
valid_series = df['temperature'].replace(0, np.nan)
# 取每个时刻前3个有效周期的均值,最少要求2个有效值
period_avg = valid_series.groupby(df['time_tag']).transform(
    lambda x: x.rolling(window=3, min_periods=2).mean()
)
# 填充缺失值
df['temp_corrected'] = valid_series.fillna(period_avg)
  • 该方案填充的结果完全匹配日常温度的日波动规律,不会出现线性插值的跨天异常斜率。

方案2:周期样条插值(适配长故障段,保留序列连续性)

如果故障段时长超过7天,需要保留温度整体的变化趋势,可以选择适配周期序列的插值方法,替代普通线性时间插值:

  • 先确认数据采样频率,按日周期长度传入插值参数,用三次样条做周期插值
  • 参考实现代码:
# 替换异常0值为NaN
df['temperature'] = df['temperature'].replace(0, np.nan)
# period参数填单周期采样点数:1小时采样填24,30分钟采样填48,15分钟采样填96
df['temp_corrected'] = df['temperature'].interpolate(
    method='spline',
    order=3,
    period=24
)
  • 如果故障段跨越多周,可以先对序列做STL时序分解,提取趋势项和周期项重建缺失段,拟合效果会比单纯样条插值更准确。

方案3:邻期加权插值(精度最高,适配天气转折期场景)

如果故障发生在升温/降温的天气转折期,直接用历史均值会和实际温度趋势有偏差,可以给相邻周期分配动态权重:

权重分配规则:距离故障段时间越近的周期权重越高,比如故障前1天同一时刻的数值权重设为0.5,故障前2天权重0.3,故障前3天权重0.2;最后叠加故障段前后端点的趋势偏移量,即可同时保留日周期波动规律和整体温度变化趋势。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:09:13