2. MATLAB工业数据导入与预处理
工业现场的数据很少以“干净、整齐、可直接建模”的形态出现。它们通常分散在CSV日志、Excel报表、关系数据库和OPC UA实时服务器中,采样周期不同、时间戳时区不一致、字段命名混乱,还夹杂着缺失、跳变和重复记录。本章围绕“把多源工业数据变成可建模的时间序列矩阵”这一目标,讲解导入、缺失值处理、异常值检测、数据对齐与重采样、时间序列同步的完整链路。
一、四类数据源的导入方式
CSV是工业日志最常见的落地格式,MATLAB用readtable即可完成带表头的读取,关键是显式指定时间列解析与缺失标记:
T = readtable('pump_log.csv', ...
'Delimiter', ',', ...
'ReadVariableNames', true, ...
'VariableNamingRule', 'preserve', ...
'TreatAsMissing', {'NA','NaN',''});
T.time = datetime(T.time, 'InputFormat','yyyy-MM-dd HH:mm:ss');
T = sortrows(T, 'time');
Excel文件用readtable或readmatrix读取,注意工作表名与数据区范围,工业报表常在前几行放标题,需用'Range'参数跳过。数据库通过Database Toolbox连接,典型流程是建立连接、执行SQL、取回结果集:
conn = database('plantdb','user','pwd', ...
'Vendor','MySQL','Server','10.20.1.5','PortNumber',3306);
sql = ['SELECT ts, flow, pressure, temp FROM sensor_data ' ...
'WHERE ts BETWEEN ''2024-03-01'' AND ''2024-03-02'''];
rows = fetch(conn, sql);
close(conn);
OPC UA是实时数据接入的重点。用opcua客户端连接服务器后,先浏览节点树定位变量NodeId,再建立订阅。工业中常用“读历史+订阅实时”组合:历史数据用readHistory补齐,实时数据用subscribe回调写入时间表。需要注意OPC UA返回的DateTime通常带时区,应统一转换为本地时间或UTC后再入库。
二、缺失值处理
缺失在工业数据中分三类:随机丢包、传感器离线导致的连续缺失、以及“0值伪缺失”(如流量计断电后输出0)。处理前先用ismissing和summary统计缺失比例与连续长度。短缺口(如1~3个采样点)用线性插值或fillmissing的'linear'方法;较长缺口若直接插值会制造虚假趋势,应标记为NaN并让后续模型跳过,或用同工况历史片段做相似性填充。对于“0值伪缺失”,需结合工艺判断:流量在停机时确实为0,不能一律当缺失,应结合设备运行状态位区分。
T.flow = fillmissing(T.flow, 'linear', 'MaxGap', 3);
T.temp = fillmissing(T.temp, 'previous'); % 温度缓变,前值保持更稳
三、异常值检测
异常值检测要区分“物理越限”和“统计离群”。物理越限直接按量程判断,例如压力传感器量程0~1.6 MPa,出现负值或超过1.6即为无效。统计离群常用三种方法:3σ准则适合近似正态的平稳段;IQR法对偏态更稳健;移动中位数绝对偏差(MAD)适合缓变工况。对时间序列,还应检测“跳变率”,即相邻点变化超过物理允许的最大斜率。
mu = mean(T.pressure,'omitnan');
sg = std(T.pressure,'omitnan');
outlier = abs(T.pressure - mu) > 3*sg;
T.pressure(outlier) = NaN; % 先置NaN,再统一插值
检测到异常后不要直接删除整行,否则会破坏时间连续性。推荐做法是置为NaN,再按缺失值策略处理,并保留一份异常标记列用于追溯。
四、数据对齐与重采样
多源数据的采样周期往往不同:PLC可能100 ms,数据库历史表1 min,Excel报表1 h。建模前必须统一到同一时间基准。MATLAB推荐用timetable承载,用synchronize完成对齐:
TT1 = table2timetable(T1);
TT2 = table2timetable(T2);
TT = synchronize(TT1, TT2, 'regular', 'mean', 'TimeStep', minutes(1));
重采样分降采样和升采样。降采样(如1 s→1 min)用均值、最大值或中位数,振动类信号应取均方根而非均值;升采样(如1 min→1 s)用线性或样条插值,但升采样不会增加真实信息,只用于对齐。对齐时还要处理时间戳偏差:若两个传感器时钟相差数秒,可先用互相关估计滞后量再平移。
五、时间序列同步的工程要点
同步不只是“时间戳对齐”,还包括时钟基准统一、采样抖动处理和事件对齐。工业现场常见三类问题:一是设备时钟未同步,导致同一事件在不同数据源中相差数秒甚至数分钟,需用NTP或PTP统一,或在离线阶段用互相关估计滞后;二是采样抖动,PLC扫描周期受负载影响,时间戳间隔不均匀,应先用retime重采样到规则网格;三是事件对齐,如故障报警时刻与振动突变时刻需要对齐到同一时间轴,才能做因果分析。
一个实用的同步流程是:先把所有源转为timetable并统一时区,再用synchronize以最高采样率为基准做外连接,然后按目标周期retime聚合,最后用fillmissing处理聚合产生的缺口。整个过程应保留原始时间戳列和同步日志,便于回溯。
六、可复用的预处理检查表
| 环节 | 检查项 | 判断依据 |
|---|---|---|
| 导入 | 时间列是否解析为datetime | 避免字符串排序错误 |
| 导入 | 缺失标记是否识别 | NA/NaN/空串统一处理 |
| 缺失 | 连续缺口长度 | >3点不插值,保留NaN |
| 异常 | 物理量程与跳变率 | 越限置NaN,保留标记列 |
| 对齐 | 时区与采样周期 | 统一UTC,TimeStep明确 |
| 同步 | 时钟偏差与抖动 | 互相关估计滞后,retime规则化 |