2. 实验数据接入与统一表示

实验数据智能异常发现的第一步,不是算法,而是把分散在不同设备、不同格式、不同时间基准上的原始记录,整理成一张“可被程序统一理解”的数据表。如果接入环节没有做好,后续的异常检测会把时间错位、单位混乱、缺失填充误判成真实异常,导致大量假警报。本节围绕多源采集、时间戳对齐、缺失值处理、元数据建模与数据字典构建五个环节,说明如何把原始实验数据变成统一表示。

多源实验数据的采集方式

实验环境中的数据源通常分为三类。第一类是传感器与采集卡,例如温度、压力、振动、电压信号,通过 Modbus、串口或 DAQ 设备以固定采样率输出;第二类是仪器软件导出的文件,例如色谱、光谱、材料试验机生成的 CSV 或 Excel;第三类是人工记录与系统日志,例如实验批次、操作员、环境条件。三类数据的接入方式不同:传感器适合流式采集,文件适合批量导入,人工记录适合表单录入。

采集时最关键的是保留“原始值 + 采集时刻 + 来源标识”三要素。以一台采样周期为 100 ms 的振动采集卡为例,每条记录至少应包含 device_id、channel、raw_value、unit、ts_device 五个字段。若采集程序只保存数值而丢弃设备时间戳,后续就无法判断数据是何时产生的,也无法与其他设备对齐。

时间戳对齐:把不同时钟拉到同一基准

多源数据最典型的问题是时间基准不一致。设备 A 使用本地时钟,设备 B 使用采集卡内部时钟,文件数据只有“实验开始后第几秒”。对齐的目标是统一到同一时间轴,常用做法是选择一个主时钟(如 NTP 同步的服务器时间),把其他来源的时间戳映射过去。

对齐分两步。第一步是时区与格式统一,把所有时间转换为同一时区的 ISO 8601 格式,例如 2024-06-12T09:30:15.250+08:00。第二步是重采样与插值。若设备 A 每 100 ms 一条、设备 B 每 1 s 一条,需要先确定统一采样周期,例如 1 s,再对高频数据做降采样(取均值或中位数),对低频数据做保持或线性插值。下面是一个对齐前后的示意:

多源数据时间戳对齐:从各自时钟到统一时间轴 设备A 振动采集卡 100 ms / 条 设备B 温度传感器 1 s / 条 仪器导出文件 相对秒 t=0 起 对齐处理 ① 时区/格式统一 ② 选主时钟基准 ③ 重采样到 1 s 统一时间轴(1 s 网格) 09:30:15 09:30:16 09:30:17 09:30:18 振动:1 s 内取均值 温度:保持上一有效值 文件:t=0 映射到起始时刻 输出:每行一个统一时间点 对齐后每条记录都带有统一时间戳,可直接按时间连接或合并

对齐时要注意:不同物理量的采样率差异很大,不能简单用“最近邻”匹配,否则高频信号会被错误地压缩。对于振动这类高频信号,通常先做特征提取(如 1 s 内的均方根、峰值),再与低频温度按秒对齐,而不是把原始波形直接塞进同一张表。

缺失值处理:先判断缺失类型,再决定策略

缺失值在实验数据中非常常见,来源包括传感器掉线、通信丢包、人工漏填、仪器量程溢出。处理前必须先区分缺失类型:完全随机缺失(如偶发丢包)、随机缺失(与某些条件相关)、非随机缺失(如超量程时被截断)。不同类型对应不同策略。

常用策略有三类。第一类是删除,仅适用于缺失比例很低且不影响整体趋势的情况,例如某通道缺失率低于 1%。第二类是填充,包括前向填充、线性插值、均值填充。对于温度这类缓变量,前向填充通常可接受;对于振动这类快变量,插值会平滑掉真实冲击,应谨慎。第三类是标记,把缺失位置单独标记为 is_missing=1,让异常检测算法自行决定是否忽略。下面给出一个缺失处理的判断顺序:

输入:某通道时间序列 values[]
1. 统计缺失率 r = 缺失点数 / 总点数
2. 若 r < 1% 且缺失分散 → 删除或前向填充
3. 若 1% ≤ r < 20% 且为缓变量 → 线性插值
4. 若为快变量或 r ≥ 20% → 保留缺失标记,不强行填充
5. 输出:values_filled[] 与 is_missing[] 两列

需要强调的是,填充值不能伪装成真实测量值。工程上建议同时保留原始列和填充列,例如 temp_raw 与 temp_filled,并在数据字典中注明填充方法,便于追溯。

元数据建模:让数据自带上下文

元数据是“描述数据的数据”。在实验场景中,元数据至少应覆盖四类信息:设备信息(设备编号、型号、量程、精度)、通道信息(通道名、单位、采样率)、实验信息(批次号、实验条件、操作员)、数据信息(采集起止时间、缺失率、版本)。没有元数据,同一列 value 在不同实验中可能代表完全不同的物理量,异常检测就失去了判断依据。

元数据建模的常见做法是采用“实验—设备—通道—数据文件”四层结构。一次实验对应一个 experiment_id,实验下挂多个设备,设备下挂多个通道,通道对应具体的数据列。这样在查询时可以通过 experiment_id + device_id + channel 唯一定位一列数据,避免歧义。

数据字典构建:统一字段与单位

数据字典是把元数据落成可执行规范的关键交付物。它规定每个字段的名称、类型、单位、取值范围、缺失标记和来源。下面给出一份可直接参考的示例数据字典,字段按实验数据接入的实际需要设计:

字段名 类型 单位 说明 示例
experiment_id string — 实验批次唯一标识 EXP-20240612-01
device_id string — 设备编号 DAQ-03
channel string — 通道名 vib_x
ts datetime ISO 8601 统一时间戳 2024-06-12T09:30:15+08:00
value float 按通道定义 测量值 0.372
unit string — 物理单位 mm/s
is_missing int — 缺失标记,0 正常 1 缺失 0
source string — 数据来源 sensor / file / manual
数据字典一旦确定,所有接入程序、存储表结构和异常检测脚本都应引用同一份定义。建议把字典保存为版本化文件(如 data_dictionary_v1.2.yaml),字段变更时同步更新版本号,避免不同环节对同一字段理解不一致。

统一表示的落地检查

完成上述五步后,可以用一组检查项确认数据是否真正“统一”:每条记录是否有唯一时间戳;单位是否统一到字典定义;缺失值是否被显式标记而非静默填充;元数据是否能反查到设备和实验;同一 experiment_id + device_id + channel 是否只对应一列数据。若这些检查通过,后续的异常检测就可以直接在统一表上按时间窗口聚合、按通道计算统计量,而不必反复处理格式差异。

常见误区:把不同单位的数值直接合并计算。例如温度用 ℃、压力用 kPa,若不做单位归一就送入同一模型,量纲差异会掩盖真实异常。统一表示阶段必须完成单位换算,并在数据字典中记录换算关系。

至此,原始实验数据已经变成结构一致、时间对齐、缺失可追溯、元数据完整、字段有字典可查的统一数据集。这是异常发现工程中最基础也最容易被低估的一步,它决定了后续算法能否把注意力放在真正的异常上,而不是消耗在数据清洗的反复返工中。