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)用线性或样条插值,但升采样不会增加真实信息,只用于对齐。对齐时还要处理时间戳偏差:若两个传感器时钟相差数秒,可先用互相关估计滞后量再平移。

工业数据导入与预处理链路 CSV 日志 readtable Excel 报表 readtable / Range 关系数据库 database / fetch OPC UA opcua / subscribe 统一 timetable datetime 时间轴 缺失值处理 fillmissing / MaxGap 短缺口插值·长缺口标记 异常值检测 3σ / IQR / MAD 物理越限 + 跳变率 对齐与重采样 synchronize / TimeStep 降采样·升采样·时延补偿 建模数据 等间隔 无缺失·无异常 关键判断依据 • 缺失:连续缺口长度 > 3 个采样点时不插值,保留 NaN 并记录标记列 • 异常:先按量程做物理越限判断,再用 3σ / IQR / MAD 做统计离群,置 NaN 而非删行 • 对齐:统一到 UTC 或本地时间,用 synchronize 指定 TimeStep 与聚合函数,振动信号取 RMS

五、时间序列同步的工程要点

同步不只是“时间戳对齐”,还包括时钟基准统一、采样抖动处理和事件对齐。工业现场常见三类问题:一是设备时钟未同步,导致同一事件在不同数据源中相差数秒甚至数分钟,需用NTP或PTP统一,或在离线阶段用互相关估计滞后;二是采样抖动,PLC扫描周期受负载影响,时间戳间隔不均匀,应先用retime重采样到规则网格;三是事件对齐,如故障报警时刻与振动突变时刻需要对齐到同一时间轴,才能做因果分析。

一个实用的同步流程是:先把所有源转为timetable并统一时区,再用synchronize以最高采样率为基准做外连接,然后按目标周期retime聚合,最后用fillmissing处理聚合产生的缺口。整个过程应保留原始时间戳列和同步日志,便于回溯。

工业数据预处理的核心原则是“可追溯”:每一步缺失填充、异常标记、重采样都应保留标记列或日志,避免后续模型无法解释数据来源。

六、可复用的预处理检查表

环节检查项判断依据
导入时间列是否解析为datetime避免字符串排序错误
导入缺失标记是否识别NA/NaN/空串统一处理
缺失连续缺口长度>3点不插值,保留NaN
异常物理量程与跳变率越限置NaN,保留标记列
对齐时区与采样周期统一UTC,TimeStep明确
同步时钟偏差与抖动互相关估计滞后,retime规则化