4. 工程数据清洗与预处理
工程数据在采集、传输、存储和人工录入的每一个环节都可能被污染。传感器掉线会产生缺失值,电磁干扰或量程溢出会产生异常值,多源系统合并会引入重复记录,不同设备的时间戳基准不一致会造成时间错位,而图纸、铭牌、仪表与数据库之间的单位差异则会让数值在物理意义上完全失真。数据清洗与预处理的目标,不是把数据“改得好看”,而是让后续的分析、建模和可视化建立在可信、可比、可追溯的数据基础上。本节围绕缺失值、异常值、重复记录、时间对齐和单位统一五类问题,给出可落地的处理思路与 MATLAB 实现方式。
缺失值:先判断机制,再选择策略
缺失值处理的第一步不是填补,而是判断缺失机制。若缺失完全随机,例如偶发的网络丢包,删除或插补都不会引入系统性偏差;若缺失与工况相关,例如高负荷时传感器频繁掉线,则简单删除会系统性丢失极端工况样本,导致模型在关键区间失效。因此,在 MATLAB 中应先用 ismissing、summary 统计各列缺失比例,并结合时间序列观察缺失是否成簇出现。
对于连续量测信号,常用策略包括:线性插值 fillmissing(T,'linear')、样条插值 'spline'、前值保持 'previous' 以及滑动窗口中位数填充。选择依据是信号的时间尺度:温度、压力等缓变量适合线性或样条插值;开关量、状态码适合前值保持;短时高频抖动则适合滑动中位数。若某列缺失比例超过 40%,且无法从其他相关测点反推,通常应将该列标记为不可用,而不是强行填补。
isImputed),以便在后续建模中区分真实值与估计值,避免把插补结果当作实测数据使用。异常值:物理边界、统计边界与上下文边界
异常值识别不能只依赖统计方法。工程数据首先受物理约束:压力不能为负,转速不能超过额定值,温度不能低于环境温度。因此第一层过滤应使用物理边界,例如 valid = (p >= 0) & (p <= 10)。第二层使用统计边界,常用 3σ 准则或四分位距 IQR 准则:Q1 - 1.5*IQR 与 Q3 + 1.5*IQR 之外的点标记为疑似异常。第三层使用上下文边界,例如某测点变化率超过物理可能的最大斜率,或与相邻测点趋势严重背离。
识别出异常值后,处理方式包括删除、置为缺失后插补、限幅(Winsorize)和分段修正。对于偶发尖峰,置为缺失再插值通常最稳妥;对于量程溢出导致的持续饱和,应结合设备量程重新标定,而不是简单截断。MATLAB 中可用 isoutlier 配合 'quartiles'、'mean'、'movmedian' 等方法快速定位,再人工复核关键点。
重复记录:按主键与时间窗口双重判定
重复记录常见于多系统合并、日志重传和人工补录。判定重复不能只看整行是否完全相同,因为同一事件在不同系统中的时间戳可能相差数秒,单位也可能不同。建议以“设备编号 + 测点编号 + 时间窗口”作为复合主键:若两条记录的主键相同且时间差小于采样周期的 1/2,则视为重复。MATLAB 中可先按主键分组,再用 diff 计算时间差,标记并保留质量最高的一条(例如非缺失字段最多、来源优先级最高)。
时间对齐:统一时基与重采样
多源数据的时间对齐是工程预处理中最容易被低估的环节。不同设备可能使用本地时钟、UTC、GPS 时间或相对时间,采样率也各不相同。对齐的目标是建立一个统一的时间基准,通常选择 UTC 或系统主时钟,并将所有序列重采样到同一时间网格。对于连续量测,可用 retime 或 resample 完成;对于状态量和事件记录,应使用前值保持或最近邻匹配,避免插值产生不存在的状态。
时间对齐还需处理时区偏移和夏令时问题。若原始数据未标注时区,应先与设备日志或采集系统配置核对,不能凭经验假设。对齐完成后,建议绘制多序列叠加图,检查关键事件(如启停、报警)是否在时间轴上同步出现,这是判断对齐是否正确的直接依据。
单位统一:建立量纲映射表
单位不统一是跨专业数据融合的常见障碍。同一压力可能以 MPa、bar、psi 记录,同一温度可能以 ℃、K、℉ 记录,同一流量可能以 m³/h、L/min、kg/s 记录。处理原则是:先为每个测点建立“原始单位 → 目标单位”的映射表,再统一换算到 SI 或项目约定单位。换算必须显式记录换算系数和偏移量,例如 bar → Pa 乘以 1e5,℃ → K 加 273.15。对于经验公式或标定曲线,还需确认其输入单位与当前数据单位一致,否则会出现数量级错误。
MATLAB 实现示例
下面给出一段可参考的预处理代码框架,假设数据已读入为 timetable 对象 T,包含 Time、DeviceID、Pressure_bar、Temp_C 等列。示例参数为教学假设,实际使用时需按项目数据调整。
% 1. 缺失值统计与插补
missingRatio = sum(ismissing(T)) / height(T);
T.Pressure_bar = fillmissing(T.Pressure_bar, 'linear');
T.Temp_C = fillmissing(T.Temp_C, 'previous');
% 2. 异常值识别(物理边界 + IQR)
validP = T.Pressure_bar >= 0 & T.Pressure_bar <= 10;
T.Pressure_bar(~validP) = NaN;
T.Pressure_bar = fillmissing(T.Pressure_bar, 'linear');
outlierIdx = isoutlier(T.Temp_C, 'quartiles');
T.Temp_C(outlierIdx) = NaN;
T.Temp_C = fillmissing(T.Temp_C, 'movmedian', minutes(5));
% 3. 重复记录去重(复合主键 + 时间窗口)
T = sortrows(T, {'DeviceID','Time'});
dt = [seconds(inf); diff(T.Time)];
dup = dt < seconds(0.5) & [false; T.DeviceID(1:end-1) == T.DeviceID(2:end)];
T(dup, :) = [];
% 4. 时间对齐与重采样
T = retime(T, 'regular', 'linear', 'TimeStep', minutes(1));
% 5. 单位统一
T.Pressure_Pa = T.Pressure_bar * 1e5;
T.Temp_K = T.Temp_C + 273.15;
T = removevars(T, {'Pressure_bar','Temp_C'});
执行后应重点检查三件事:一是插补前后关键统计量(均值、方差、极值)是否发生剧烈变化;二是重采样后时间轴是否等间隔且无重复时间戳;三是单位换算后的数值范围是否符合物理常识。若发现异常,应回到对应步骤复核,而不是在后续建模中掩盖问题。
完成上述五类处理后,数据才具备进入特征提取、统计分析和可视化阶段的基本条件。清洗不是一次性动作,而应嵌入数据管道,在每次新数据接入时自动执行,并输出质量报告,使数据可信度成为可监控的工程指标。