4. 数据质量检查与预处理

养殖场能耗数据通常来自多个采集环节:环境控制柜的三相电表、风机与水帘的独立电表、料塔与饮水系统的分项计量、以及人工抄表记录。这些数据在进入分析模型之前,几乎不可能"开箱即用"。缺失、异常、重复、时间错位、单位混乱是常态。本节的任务,是把这些原始记录整理成一份字段规范、时间连续、量纲一致、异常可追溯的可分析数据集。这一步做不扎实,后面所有的能耗对比、趋势分析和节能诊断都会建立在不可靠的基础上。

先明确"可分析数据集"的验收标准

在动手清洗之前,先约定验收口径,避免清洗过程漫无目的。对养殖场能耗数据,一份合格的可分析数据集通常满足以下条件:每条记录有唯一标识;时间戳统一到同一时区并落在固定采样间隔上;关键字段(如总有功电量、分项电量、舍内温度)无缺失或缺失已标记;数值落在物理合理区间内;单位统一为千瓦时(kWh)、千瓦(kW)、摄氏度(℃)等标准量纲;重复上报的记录已去重。这些条件不是抽象要求,而是后续计算单位面积能耗、分项占比、负荷曲线时的直接前提。

缺失值:先判断成因,再决定处理方式

缺失值处理最忌讳"一刀切填充"。养殖场能耗数据的缺失大致有三类成因:一是通信中断,比如某栋舍的采集网关在雷雨天气掉线,导致连续数小时无数据;二是设备停机,比如风机在冬季未启用,其分项电表读数为空或为零;三是人工录入遗漏,抄表记录中个别日期空缺。三类成因对应完全不同的处理策略。

对通信中断造成的短时缺失(例如连续缺失不超过 3 个采样点),可采用线性插值或前向填充,并在数据集中增加一个"是否插值"标记字段,保留可追溯性。对设备停机造成的缺失,不应填充为正常值,而应标记为"未运行",否则会把停机时段误算成低能耗时段,扭曲负荷曲线。对长时间缺失(例如超过 24 小时),建议整段标记为无效区间,不参与统计,而不是用均值强行填补。下面是一段用 Python 处理缺失并保留标记的示例:

import pandas as pd

df = pd.read_csv("farm_energy_raw.csv", parse_dates=["ts"])
df = df.sort_values(["meter_id", "ts"])

# 标记原始缺失
df["is_missing"] = df["energy_kwh"].isna()

# 仅对短时通信缺失做插值,设备停机不插值
df["energy_kwh_filled"] = (
    df.groupby("meter_id")["energy_kwh"]
      .transform(lambda s: s.interpolate(method="linear", limit=3))
)
df["is_interpolated"] = df["energy_kwh_filled"].notna() & df["is_missing"]

这段代码的关键在于 limit=3 限制了插值跨度,超过 3 个连续缺失点保持为空,交由后续规则判定为无效区间。这样既补上了偶发丢包,又不会掩盖真实停机。

异常值:用物理边界和统计规则双重筛查

异常值识别要结合业务常识。能耗数据中常见的异常包括:电量为负值(接线错误或电表翻转)、单点电量突增数十倍(抄表错误或倍率设置错误)、功率因数超出 0~1 范围、温度记录出现 -40℃ 或 80℃ 这类明显不可能的读数。建议先设物理边界硬规则,再用统计方法做补充筛查。

物理边界规则可以直接写成判断条件:总有功电量应大于等于 0;单栋舍日电量不应超过该舍装机容量乘以 24 小时的合理上限;功率因数应在 0 到 1 之间。统计方法可用四分位距(IQR)法:计算某分项电量的第一四分位数 Q1 和第三四分位数 Q3,将小于 Q1−1.5×IQR 或大于 Q3+1.5×IQR 的点标记为疑似异常。需要注意,IQR 法对养殖场这种存在明显季节性的数据要分季节或分月计算,否则夏季风机高负荷会被误判为异常。

异常值不等于错误值。标记为异常后应保留原始值并增加"异常类型"字段(如"负值""突增""超物理边界"),由人工复核决定修正、剔除还是保留。直接删除会丢失排查线索。

重复记录:按唯一键去重并保留最新

重复记录多来自网关重传或人工重复录入。判断重复的依据应是"计量点编号 + 时间戳"这一组合键,而不是整行完全相同。实际数据中,同一时刻同一电表可能上报两条记录,数值略有差异,此时应保留采集时间更晚或质量标记更高的一条。去重时建议先按唯一键分组,再按采集时间排序取最后一条,同时统计被去除的重复条数,作为数据质量报告的一项指标。

时间对齐:把不同频率的数据拉到同一时间轴

养殖场各类数据的采样频率往往不一致:电表可能 15 分钟一采,温湿度传感器 5 分钟一采,人工抄表按日。要做关联分析,必须统一时间粒度。常用做法是把所有数据聚合到 15 分钟或 1 小时的时间格上。电量类累计量在一个时间格内应取差值或求和,温度类瞬时量应取均值。同时要处理时区问题,统一转换为北京时间并明确标注,避免跨时区或夏令时造成错位。

能耗数据预处理流程与质量关卡 原始数据源 三相电表 15min 温湿度 5min 人工抄表 按日 缺失值处理 短时→插值 停机→标记 长缺→无效区间 异常值筛查 物理边界 IQR 分季 保留+标记 重复去重 键:计量点+时间 保留最新 统计去除数 时间 对齐 15min 北京时间 单位统一 kWh / kW / ℃ / % 倍率换算、量纲核对 可分析数据集 唯一标识 · 连续时间轴 质量标记 · 标准量纲 数据质量报告 缺失率 · 异常条数 重复去除数 · 无效区间 关键原则: ① 缺失先判成因,停机不插值;② 异常保留原值并标记类型,人工复核;③ 去重按"计量点+时间"键;④ 时间统一到固定格并标注时区;⑤ 单位换算留痕,倍率错误是常见隐患。

单位统一:倍率错误是最隐蔽的坑

养殖场电表常配电流互感器,读数需要乘以倍率才是实际电量。如果清洗时忽略了倍率,某栋舍的能耗可能被低估几十倍,而数据本身看起来完全"正常"。因此单位统一不仅是把"度"改成"kWh",更要核对每个计量点的倍率配置、量纲和累计方式。建议在数据集中保留"原始读数""倍率""换算后电量"三个字段,任何一次换算都可回溯。温度、湿度、功率因数等字段同样要统一小数位和单位符号,避免同一列中混入"℃"和"摄氏度"两种写法。

形成可分析数据集与质量报告

完成上述处理后,输出两份成果:一份是清洗后的主数据集,字段包括计量点编号、时间戳、换算后电量、温度、质量标记(是否插值、是否异常、异常类型);另一份是数据质量报告,记录各环节的处理条数,例如原始记录数、缺失条数及缺失率、异常标记数、重复去除数、无效区间数。质量报告不是形式主义,它决定了后续分析结论的可信度——如果某栋舍缺失率超过 20%,那么基于该舍数据的节能结论就应当谨慎表述。

预处理脚本应保留原始数据副本,所有清洗操作在副本上进行。养殖场数据往往需要回溯排查,一旦原始记录被覆盖,异常原因就再也无法还原。

把这一节的工作做扎实,后续的能耗基准线建立、分项占比分析、异常能耗诊断才有可靠的数据底座。预处理不是分析前的杂活,而是决定分析上限的关键环节。