3. 海洋环境数据预处理与清洗实战

海洋环境观测数据在进入分析模型之前,几乎不可能“开箱即用”。温盐深(CTD)剖面会因传感器响应滞后、泵停或下降速率不均产生尖峰;海流观测受生物附着、气泡和磁偏角影响出现漂移;波浪记录则常因浮标剧烈摇晃、雨滴打击或雷达遮挡出现跳变。本节围绕缺失值插补、异常值检测、噪声平滑、时间对齐与空间插值五类操作,结合温盐深、海流、波浪三类典型数据,说明“怎么判断、怎么处理、怎么验证”的完整链条。

一、先建立数据质量基线

清洗不是盲目套算法,而是先明确数据的时空结构与物理量纲。以温盐深剖面为例,一条剖面是“压强—深度”方向的一维序列,采样间隔约0.1~1 dbar,温度、盐度、溶解氧随深度变化;海流是固定站点或走航ADCP的时间序列,含东向、北向分量;波浪浮标输出有效波高、周期、波向等要素,采样频率常为1~2 Hz。处理前应统一记录:时间基准(UTC)、坐标与方位约定(海流正东为正、正北为正)、缺测编码(如-999、NaN)以及各变量的合理物理范围。

建议先做“三查”:查时间戳是否单调递增、查重复记录、查缺测编码是否被误当作有效值参与统计。很多“异常值”其实是缺测码混入,例如盐度出现 -999 或温度出现 999,这类值应在异常检测之前先转为 NaN。

二、缺失值插补:按缺口长度与物理约束选方法

缺失分两类:孤立缺失(单点或极短缺口)和连续缺失(传感器故障、通信中断造成的长缺口)。孤立缺失可用线性插值或三次样条,在剖面数据上沿深度方向插值;连续缺失则要谨慎,短缺口(如少于3个采样点)可线性插补,较长缺口应标记为缺测,避免用插值“造数据”。对海流时间序列,若缺口跨越潮周期,线性插值会抹平潮流信号,此时可用同一站点相邻日期的谐波拟合结果或邻近站点回归进行辅助填补,并在结果中保留插补标记列。

import numpy as np, pandas as pd
# 示例:CTD剖面温度沿深度线性插补(仅限短缺口)
df = pd.read_csv("ctd_profile.csv")          # 列: pressure, temp, sal
df.loc[df.temp < -5, "temp"] = np.nan        # 先清理缺测码
df["temp_filled"] = df["temp"].interpolate(
    method="linear", limit=3, limit_direction="both")
df["temp_flag"] = df["temp"].isna().astype(int)  # 1=曾缺失

示例中 limit=3 表示最多连续插补3个点,超过则保持 NaN。插补后必须保留 temp_flag,便于后续统计时区分实测与插补值。

三、异常值检测:物理阈值、统计准则与邻域一致性

异常检测建议三层过滤。第一层是物理阈值:温度 -2~40 ℃、盐度 0~42、有效波高 0~25 m、流速 0~5 m/s,超出即判为可疑。第二层是统计准则:对近似正态的变量用 3σ 或稳健的 MAD(中位数绝对偏差)准则,MAD 对极端值不敏感,更适合海洋数据;对海流分量可计算流速模长后检测。第三层是邻域一致性:CTD 剖面中温度随深度应连续变化,若某点与上下邻点的差值超过设定梯度阈值(如 1 dbar 内温度跳变大于 0.5 ℃),则判为尖峰。

# 示例:MAD稳健异常检测(海流东向分量)
x = df["u"].to_numpy()
med = np.nanmedian(x)
mad = np.nanmedian(np.abs(x - med))
thr = 3 * 1.4826 * mad
df["u_outlier"] = np.abs(x - med) > thr

检测到异常后不要直接删除,应先判断成因:单点尖峰可用邻点中值替换;连续漂移往往意味着传感器故障,应整段标记为不可用,而不是逐点修补。

温盐深 / 海流 / 波浪数据清洗处理链 原始观测 → 质量基线 → 缺测处理 → 异常检测 → 噪声平滑 → 时间对齐 → 空间插值 → 可用数据集 原始观测 CTD/ADCP/浮标 质量基线 时间/量纲/缺测码 缺测处理 短缺口插补+标记 异常检测 阈值+MAD+梯度 噪声平滑 滑动中值/低通 时间对齐 重采样/UTC统一 空间插值 IDW/克里金/剖面 结果验证 统计+物理合理性 可用数据集 含质量标记列 关键判断依据 · 缺测:缺口长度 ≤3 点可插补,长缺口标记不可用,禁止跨潮周期线性插值 · 异常:物理阈值 → MAD 稳健准则 → 剖面梯度/邻域一致性,三层依次过滤 · 平滑:滑动中值去尖峰,低通滤波去高频噪声,窗口宽度需小于目标信号尺度

四、噪声平滑:窗口宽度要与信号尺度匹配

平滑的目标是压制高频噪声而保留真实变化。对波浪浮标的高频采样记录,可先做滑动中值(窗口5~11点)去除雨滴或撞击造成的单点尖峰,再用低通滤波(如截止频率0.5 Hz)保留波浪主频段。对CTD温度剖面,传感器响应滞后会造成“拖尾”,可用一阶滞后校正或轻度滑动平均,但窗口不宜过大,否则会削弱温跃层梯度。判断标准是:平滑前后温跃层位置和强度不应发生明显偏移,若偏移超过一个采样间隔,说明窗口过宽。

五、时间对齐:统一到同一时间轴

多源数据融合时,CTD按深度采样、ADCP按时间采样、浮标按固定间隔输出,必须统一时间基准。做法是:全部转换为UTC,去除重复时间戳,按目标分辨率重采样。对瞬时量(温度、盐度)用线性插值或最近邻;对累积量或通量(如降水、辐射)用区间平均;对波浪有效波高这类统计量,重采样时应取窗口内均值而非瞬时插值。海流数据还要注意ADCP的层深与CTD深度对应,必要时按深度插值到同一层网格。

六、空间插值:从站点到网格

当需要把离散站点观测映射到规则网格时,常用反距离加权(IDW)、克里金和剖面插值。IDW实现简单,适合站点较密、变化平缓的要素;克里金能给出估计方差,适合有空间相关结构的海温场;对CTD剖面,则沿深度方向插值到标准层(如1 m间隔)。空间插值必须设置搜索半径和参与点数上限,避免远处站点“拉平”局地特征。插值结果应做交叉验证:留出部分站点,比较预测值与实测值的均方根误差,误差明显偏大的区域应标注为低置信度。

七、结果验证与交付

清洗完成后,至少检查三项:一是统计量是否合理(均值、极值、缺测比例);二是物理一致性(温度—盐度关系是否出现不合理散点、流速是否超过历史极值);三是可视化抽查(剖面曲线、时间序列、空间分布图)。交付数据集应包含原始值、处理后值和质量标记列,标记区分实测、插补、剔除、平滑四类状态,使后续分析可以按需筛选。只有把“处理过程可追溯、处理结果可验证”作为交付标准,海洋环境数据才能真正支撑后续的智能分析与预测。