3. 海洋监测数据预处理与缺测标记

海洋监测数据在进入分析、同化或建模之前,必须经过一轮“清洗与标注”。这一步的核心任务不是把数据改得好看,而是把原始记录转换成时间轴统一、异常与缺测可区分、缺测原因可追溯的规范数据集。浮标、潜标、调查船、卫星遥感的数据来源不同,格式与采样节律差异很大,如果预处理阶段处理不当,后续的插补、统计和趋势分析都会建立在错误前提上。

一、数据格式解析:先看清“原始记录长什么样”

海洋监测数据常见的原始形态有三类:定宽或逗号分隔的文本表、带元数据的 NetCDF/HDF 文件、以及设备私有二进制或十六进制报文。文本表最典型,例如某浮标每 10 分钟输出一行:

# station=BF-03  sensor=CTD  time_utc=2024-06-01T00:00:00Z
2024-06-01T00:00:00Z, 15.82, 34.106, 0.00, 99.0
2024-06-01T00:10:00Z, 15.79, 34.101, 0.00, 99.0
2024-06-01T00:20:00Z, 15.81, 34.098, 0.00, 99.0
2024-06-01T00:30:00Z, 15.80, 34.099, 0.00, 99.0

解析时要逐列确认四件事:时间字段的时区与格式、物理量的单位、缺测填充值(如 99.0、-999、NaN)、以及质量标志列是否存在。很多设备用 99.0 表示“传感器未就绪”,如果直接当作水温 99 ℃参与统计,会立刻污染整段序列。因此解析阶段应建立字段映射表,把原始列名、单位、量程、填充值、有效位一一登记,作为后续判断的依据。

二、时间轴对齐:把不同节律的数据放到同一把尺子上

同一浮标上,CTD 可能 10 分钟一采,溶解氧 30 分钟一采,气象要素 1 分钟一采。时间轴对齐的目标是生成一条统一的时间网格(如 10 分钟间隔),再把各要素按规则映射上去。常用规则是:落在同一网格区间内的多条记录取均值或取最近值;区间内无记录则标记为缺测,而不是用前后值随意填补。

对齐时还要处理时间戳本身的偏差:设备时钟漂移、UTC 与本地时混用、夏令时切换、重复时间戳。建议先做时间戳去重与单调性检查,再统一转换为 UTC,最后按网格重采样。对齐后的每个网格点应同时携带“值”和“状态”,状态至少区分有效、异常、缺测三类,这是后续标记流程的基础。

原始多源数据 → 统一时间网格 → 状态判定 → 标准化缺测标记 原始记录 CTD 10 min 溶解氧 30 min 气象 1 min 填充值 99.0 / -999 格式解析 字段映射 / 单位 时区统一为 UTC 去重 / 单调性检查 登记量程与填充值 时间轴对齐 10 min 统一网格 区间聚合 / 最近值 无记录 → 待判定 每点携带值 + 状态 状态判定 量程 / 跳变 / 冻结 异常 vs 缺测 标记原因码 保留原始值不改写 统一网格上的状态序列(示例) 00:00 00:10 00:20 00:30 00:40 00:50 01:00 01:10 有效 异常(超量程/跳变) 缺测(无记录/传感器失效) 标准化输出字段: time_utc | value | unit | qc_flag(0有效/1异常/2缺测) | reason_code | source 原则:原始值保留不改写,状态与原因单独成列,便于回溯与重处理。

三、异常值与缺测:必须分开对待

异常值和缺测在数据表里都可能表现为“不可用”,但成因和处理方式完全不同。异常值是传感器给出了读数,但读数不可信,例如水温突然从 15.8 ℃跳到 28.4 ℃又立刻回落、盐度超出 0~42 的物理量程、连续多个时刻数值完全冻结不变。缺测则是根本没有有效观测,例如通信中断导致整段无记录、传感器故障后输出填充值、维护期间停机。

区分二者的实用判据是:先看原始记录是否存在、是否为填充值;再看数值是否落在量程内、变化率是否超过物理上限、是否长时间冻结。异常值应标记为“异常”并保留原值供复核,缺测则标记为“缺测”并记录原因码。把异常误判为缺测,会掩盖传感器漂移问题;把缺测误判为异常,则可能让插补算法去“修复”一段本就没有观测的空白。

四、缺测标记标准化流程

标准化流程建议固定为五步,并在每一步留下可追溯的记录:

  1. 建立时间网格:按要素确定目标分辨率,生成完整时间序列,未观测到的网格点先置为空。
  2. 初判缺测:原始无记录、等于填充值、解析失败的点,标记为缺测并写入原因码(如 NO_RECORD、FILL_VALUE、PARSE_ERR)。
  3. 异常筛查:对已有数值做量程检查、变化率检查、冻结检查,命中则标记为异常(OUT_OF_RANGE、SPIKE、FROZEN)。
  4. 状态定稿:异常点若经复核确认传感器失效,可转为缺测;缺测点不得凭经验直接改为有效。
  5. 输出与登记:生成带 qc_flag、reason_code 的规范表,并登记处理时间、规则版本、处理人,保证可复现。
建议统一使用数值型质量标志:0 表示有效,1 表示异常,2 表示缺测。原因码用固定枚举字符串,避免同一含义出现多种写法,便于后续统计缺测率与按原因分类。

五、实战:某浮标数据缺测标记

假设某浮标 BF-03 的 CTD 数据为 10 分钟一条,2024 年 6 月 1 日 00:00 至 01:10 的原始水温记录如下(示例数据,用于演示处理逻辑):00:00 至 00:20 为 15.82、15.79、15.81 ℃;00:30 为 28.40 ℃;00:40 与 00:50 无记录;01:00 与 01:10 为 15.80、15.78 ℃。填充值约定为 99.0,量程设为 -2~35 ℃,相邻 10 分钟变化率上限设为 2 ℃。

处理过程:00:30 的 28.40 ℃虽在量程内,但相对前一时刻跳变约 12.6 ℃,超过变化率上限,标记为异常(SPIKE),保留原值;00:40、00:50 原始无记录,标记为缺测(NO_RECORD);其余点通过量程与变化率检查,标记为有效。最终该段缺测率为 2/8 = 25%,异常率为 1/8 = 12.5%。若后续要做插补,只对缺测点按规则处理,异常点应先复核传感器状态,不能与缺测混为一谈。

时间(UTC)原始水温/℃qc_flagreason_code说明
00:0015.820—有效
00:1015.790—有效
00:2015.810—有效
00:3028.401SPIKE跳变超限,待复核
00:40—2NO_RECORD无原始记录
00:50—2NO_RECORD无原始记录
01:0015.800—有效
01:1015.780—有效

这张表就是预处理阶段的直接交付物:时间轴统一、状态明确、原因可查。它既可以直接进入缺测率统计,也可以作为后续插补模块的输入。需要强调的是,标记阶段的原则是“只标注、不改写”,任何对数值的修改都应发生在独立的插补环节,并保留原始值和处理日志,这样整条数据链才具备可追溯性和可复现性。