4. 能源数据预处理与质量控制

能源数据从采集端进入分析平台之前,几乎不可能直接可用。电表、水表、气表、温度传感器、流量计等设备受通信中断、时钟漂移、量程溢出、电磁干扰和人为操作影响,原始数据往往同时存在缺失、异常、噪声和时间错位。若不做预处理,后续的负荷预测、能效诊断和异常预警都会建立在错误基础上。本节围绕四类典型问题——缺失值、异常值、噪声、时间对齐——说明判断依据与可落地的清洗方法。

一、先明确数据质量检查的参照约定

能源数据通常以“时间戳 + 测点编号 + 数值 + 单位”为最小记录单元。时间戳统一采用带时区的标准时间,例如 2024-06-01T08:15:00+08:00;采样周期按设备类型约定,电类数据常见 1 min 或 15 min,温度、流量常见 1 min。判断异常时,参照系必须统一:例如功率因数正常范围为 0~1(滞后为正),有功功率正负号表示“消耗/倒送”,这些约定要在清洗规则中显式声明,避免同一列数据在不同环节被反向解释。

二、缺失值:先分类,再决定补不补

缺失分三种:完全随机缺失(如单点通信丢包)、随机缺失(如某时段网关重启)、非随机缺失(如传感器故障后长期无数据)。处理前先统计缺失率与连续缺失长度。对于单点或短时缺失(连续不超过 3 个采样点),可用线性插值或前向填充;对于与负荷周期强相关的测点,优先用“同类型日同时刻均值”填充。若连续缺失超过 1 小时,或缺失率超过 5%,不应强行插值,而应标记为无效区间并排除出统计样本。

# 示例:按测点分组,对短时缺失做时间线性插值
df = df.sort_values(["point_id", "ts"])
df["value"] = (
    df.groupby("point_id")["value"]
      .apply(lambda s: s.interpolate(method="time", limit=3))
)
# limit=3 表示最多连续补 3 个点,超过则保留 NaN 并打质量标记
df["quality"] = df["value"].isna().map({True: "MISSING", False: "OK"})

三、异常值:物理边界 + 统计边界双筛

异常值识别不能只靠 3σ。工程上建议两层过滤:第一层是物理边界,例如有功功率不能超过变压器额定容量的 1.2 倍,温度不能超过传感器量程,流量不能为负;第二层是统计边界,用箱线图 IQR 或滚动中位数绝对偏差(MAD)识别偏离。对识别出的异常点,先判断是“单点毛刺”还是“持续偏移”:单点毛刺可用中位数滤波替换;持续偏移往往意味着设备故障或工况切换,应保留并单独告警,而不是直接删除。

判断顺序建议:物理越界 → 统计离群 → 时间连续性 → 业务合理性。四步都通过,才认定为有效数据。

四、噪声:区分高频抖动与真实波动

噪声表现为相邻采样点间无规律的小幅跳动。对电功率、流量这类连续量,可用滑动平均、Savitzky-Golay 滤波或小波阈值去噪。选择方法时看两点:一是是否保留负荷突变(如设备启停的阶跃),二是是否引入相位延迟。Savitzky-Golay 在保留峰值形状上优于普通滑动平均,适合 15 min 级负荷曲线;对启停频繁的电流信号,则更适合中位数滤波,避免把真实阶跃抹平。

五、时间对齐:把不同频率的测点拉到同一时间轴

电表 15 min、温度 1 min、流量 5 min,直接合并会产生错位。常用做法是统一重采样到较粗粒度(如 15 min),对瞬时量取区间均值,对累计量取区间末值减区间初值。若设备时钟存在漂移,先用同一事件(如某台设备启停造成的功率跃变)做互相关对齐,再统一时间戳。对齐后要检查每个时间窗内各测点是否都有值,缺失的窗口按缺失值规则处理。

能源数据清洗流程与质量控制判断链 原始采集数据 时间戳 / 测点 / 数值 单位 / 质量标记 缺失值处理 短缺失:插值/前向填充 长缺失:标记无效区间 异常值识别 物理边界 + IQR/MAD 毛刺替换 / 偏移告警 噪声抑制 滑动平均 / S-G / 中位数 保留真实阶跃 时间对齐与重采样 统一到 15 min 时间轴:瞬时量取均值,累计量取差值 时钟漂移用互相关对齐后再合并 质量判定与输出 有效 / 插补 / 无效 / 告警 四类标记 输出清洗后数据集 + 质量报告 关键判断条件 缺失率 ≤ 5%? 连续缺失 ≤ 3 点? 示例结果 OK: 92.4% 插补: 4.1% / 无效: 3.5% 注:示例比例与阈值仅用于说明判断逻辑,实际项目应按测点类型和业务要求设定。

六、清洗后的质量标记与验证

清洗不是“把数据改好看”,而是让每条记录都带有可追溯的质量状态。建议输出四类标记:OK(原始有效)、IMPUTED(插补)、INVALID(无效区间)、ALERT(异常但保留)。清洗完成后做三项验证:一是统计各测点缺失率、异常率是否在可接受范围;二是抽查典型日曲线,确认没有把真实峰谷削平;三是用清洗前后数据分别跑同一诊断规则,观察告警数量是否显著减少且未漏报关键事件。

实操建议:把清洗规则写成可配置的 YAML 或 JSON,按测点类型绑定不同阈值。例如电功率用物理上限 + IQR,温度用量程 + 滑动 MAD,流量用非负约束 + 中位数滤波。规则版本化保存,便于回溯和复现。

七、常见误区与排障

  • 过度插值:把连续几小时的缺失全部线性补齐,导致负荷曲线出现虚假平滑段,影响需量分析。
  • 只删不标:直接删除异常点却不记录,后续无法判断是设备故障还是数据问题。
  • 时间对齐粒度不一致:把 1 min 温度直接与 15 min 电表按行合并,造成时间错位。
  • 忽略单位与量纲:kW 与 W、kWh 与 MWh 混用,导致阈值判断整体偏移。

排障时按“先看时间戳是否对齐,再看缺失与异常标记,最后看数值分布”的顺序检查。若某测点告警突然增多,优先核对采集网关时钟和通信状态,而不是直接调整统计阈值。清洗后的数据集应保留原始值、清洗值、质量标记和规则版本四个字段,确保任何一条诊断结论都能追溯到数据来源和处理过程。