2. 实验数据常见类型与来源解析

在实验数据自动清洗与转换工程中,第一步并不是写代码,而是识别数据“长什么样、从哪里来、带着什么约束”。同一批实验里,传感器时序数据、仪器导出表格、日志文本、图像元数据和高通量实验记录往往同时存在,它们的结构、时间语义、缺失模式和清洗需求差异极大。如果把它们统一当作“表格”处理,后续转换几乎必然出错。本节按来源逐类解析其特点,并给出对应的清洗转换策略。

传感器时序数据:连续、带时间戳、易漂移

传感器时序数据通常由采集卡、PLC 或数据采集软件按固定采样周期写入,典型形式是“时间戳 + 通道值”的宽表或长表。例如某温度采集系统以 10 Hz 采样,输出 timestamp, ch1_temp, ch2_temp, ch3_pressure,其中时间戳可能是 Unix 毫秒、ISO 8601 字符串或设备本地时间。它的核心特点是:采样频率固定但可能抖动、存在丢点与重复点、量纲和单位随通道变化、长期运行会出现零点漂移。

清洗这类数据时,重点不是“去重”本身,而是重建时间轴。常见做法是:先统一时间戳为 UTC 毫秒,再按标称采样周期生成规则时间网格,用前向填充或线性插值补齐短缺口,对超过阈值的长缺口标记为无效段而不是强行插值。例如采样周期 100 ms,若相邻两点间隔 350 ms,则判定丢失约 2 个点;若间隔超过 5 s,则视为设备中断,保留断点标记。单位换算也必须在清洗阶段完成,如将原始 ADC 值按 value = raw * 0.01 + offset 转为物理量,避免下游混用。

仪器导出表格:格式固定但“表头不固定”

光谱仪、色谱仪、力学试验机等仪器导出的表格,常带有仪器名称、序列号、方法名、操作者、导出时间等前置信息行,真正的数据表头可能出现在第 8 行或第 12 行。列名可能是中文、英文或缩写,如 Wavelength(nm)、Abs、Sample ID。这类数据的清洗难点在于“定位表头”和“统一列语义”,而不是数值本身。

实践中可先扫描前若干行,寻找包含已知字段关键词的行作为表头行,再将其余行解析为数据区。对于同一实验室内多台仪器,建议建立列名映射表,把 Abs、Absorbance、吸光度 统一映射为 absorbance,并记录原始列名以便追溯。仪器导出表格还常出现合并单元格、空列、单位写在列名括号内等情况,转换时应把单位拆分为独立字段或统一换算到 SI 单位。

日志文本:半结构化、事件驱动、需抽取

日志文本来自设备控制软件、实验流程引擎或脚本,典型行如:

2024-05-12 09:31:07.482 INFO  [reactor-01] setpoint=80.0C actual=79.6C valve=OPEN
2024-05-12 09:31:08.113 WARN  [reactor-01] temp deviation 0.9C exceeds 0.5C
2024-05-12 09:31:09.007 ERROR [reactor-01] sensor ch2 timeout, retry 1/3

日志不是表格,但包含时间、级别、设备、键值对和自然语言描述。清洗目标是把可结构化的事件抽取为表:时间戳、级别、设备、事件类型、参数、原始消息。对键值对可用正则抽取,对自然语言告警则保留原文并附加事件标签。需要注意日志时间可能与传感器时间不同源,必须统一时区并检查时钟偏差;同一事件在日志中重复出现时,应按“时间 + 设备 + 事件类型”去重,而不是简单按整行去重。

图像元数据:与像素分离、字段稀疏

显微图像、高速相机、红外热像仪产生的图像,其元数据可能写在 EXIF、TIFF 标签、侧车 JSON 或文件名中。典型字段包括采集时间、曝光、增益、物镜倍数、像素尺寸、温度、位置坐标等。图像元数据的清洗重点是“对齐实验批次”和“补齐关键字段”。例如文件名 exp023_sample05_40x_20240512.tif 可解析出实验号、样品号、倍数和日期,但曝光、增益可能只在侧车文件中。

转换时建议把每张图像视为一行记录,字段包括 image_id, file_path, capture_time, magnification, exposure_ms, gain, pixel_size_um, batch_id。缺失字段应显式标记为 null 并记录来源,而不是用默认值填充,否则后续按曝光筛选时会产生错误结论。若图像用于定量分析,还需检查元数据中的像素尺寸与实际标定是否一致。

高通量实验记录:宽表、多批次、强依赖实验设计

高通量实验(如催化剂筛选、材料配方、细胞板实验)常以宽表或嵌套 JSON 记录,一行可能对应一个样品,列包含配方参数、工艺条件、多个测量结果。其特点是列数多、批次间列名不一致、存在大量空值和重复实验。清洗时需要先对齐实验设计表,把“配方参数”和“测量结果”分离,再按样品 ID 关联。

例如某批次记录中,sample_id, A_conc, B_conc, temp, yield, purity 是核心列,但不同批次可能写成 conc_A、A_mol。此时应通过映射表统一为 conc_A_molL,并对超出合理范围的数值(如 yield > 100%)标记为异常。高通量数据的转换重点在于“可追溯”:每个清洗后的字段都应能回溯到原始列和原始文件。

五类实验数据来源 → 清洗转换需求差异 传感器时序数据 时间戳+通道值 固定采样/易漂移 仪器导出表格 前置信息行 表头位置不固定 日志文本 半结构化 事件驱动/需抽取 图像元数据 EXIF/TIFF/侧车 字段稀疏/需对齐 高通量实验记录 宽表/多批次 强依赖实验设计 清洗转换核心动作(按来源差异化) 时间轴重建 统一UTC/规则网格 短缺口插值/长缺口标记 表头定位与列映射 扫描关键词行 同义列名归一化 事件抽取 正则提取键值对 告警保留原文+标签 元数据对齐 文件名解析+侧车合并 缺失显式标null 实验设计对齐 参数/结果分离 异常范围标记 统一中间层:规范化表 + 来源追溯字段 source_type / source_file / raw_row_id / ingest_time / unit 关键原则:先识别来源类型,再选择清洗策略;不同来源不可用同一套缺失值、去重和单位规则。 所有转换必须保留原始行号与文件路径,保证可回溯、可复核。

来源差异如何决定清洗转换策略

把上述五类数据放在一起看,差异集中在四个维度:时间语义、结构稳定性、缺失模式和单位/量纲。传感器数据的时间是连续的、可插值的;日志时间是事件驱动的、不可插值;仪器表格和图像元数据的时间往往是采集时刻,属于点事件;高通量记录的时间可能只到批次级别。结构上,传感器和仪器表格相对稳定,日志和图像元数据需要抽取,高通量记录则随实验设计变化。

因此,清洗转换工程不应从“写一个通用脚本”开始,而应先建立来源识别与路由:根据文件扩展名、首行特征、是否存在时间戳列等,把输入分派到对应解析器。每个解析器输出统一的中间层字段,包括 source_type、source_file、raw_row_id、ingest_time、unit 等追溯字段。这样,后续的去重、缺失处理、单位换算和异常检测才能按来源类型分别配置,而不是互相污染。

实践建议:在项目初期先抽取 20~50 条各类来源的真实样本,人工标注其表头行、时间格式、缺失表示(空、NA、-999、null)和单位,再据此编写解析规则。这一步的投入通常能避免后期大量返工。
常见误区:把日志中的“-999”当作有效数值、把仪器表格的前置信息行误读为数据、把图像元数据的缺失曝光值默认填 0。这些都会在后续统计中产生系统性偏差,且难以追溯。

综上,实验数据清洗转换的第一步是“认源”:识别它属于哪一类、时间如何表达、结构是否稳定、缺失如何标记、单位是什么。只有把来源特点与清洗需求一一对应,后续的自动转换流程才具备可靠性和可复现性。