2. 海洋时间序列数据清洗与预处理

浮标、潜标、岸基观测站和卫星遥感构成了海洋数据的主要来源,而它们几乎无一例外地会产生“脏”时间序列:传感器掉线造成整段缺失,生物附着或电压漂移带来异常尖峰,数据采集器重启导致时间戳重复,不同仪器的采样间隔从1分钟到1小时不等。清洗与预处理的目标,是把这些原始记录整理成一条时间索引唯一、间隔规则、数值可信的序列,为后续的潮汐分析、谱分析和统计建模提供可靠输入。

一、先统一时间索引,再谈数值处理

海洋数据清洗的第一步不是填补缺失值,而是建立统一的时间基准。常见问题包括:时间戳为字符串、时区混用(UTC与本地时)、存在夏令时跳变、同一时刻出现多条记录。pandas 的 DatetimeIndex 是处理这些问题的核心工具。建议统一转换为 UTC 并设为索引,再用 resample 建立规则网格。

import pandas as pd

df = pd.read_csv("buoy_raw.csv")
# 统一解析为 UTC 时间索引
df["time"] = pd.to_datetime(df["time"], utc=True)
df = df.set_index("time").sort_index()

# 去除重复时间戳,保留最后一条(通常为修正后的记录)
df = df[~df.index.duplicated(keep="last")]

# 重采样到统一的 10 分钟网格,取均值聚合
ts = df["sea_temp"].resample("10min").mean()

重采样时要注意聚合方式的选择:温度、盐度适合取均值;水位在潮汐高频变化下若原始间隔较粗,均值会低估峰值,可考虑保留瞬时值或使用中位数抗尖峰。重采样后,原本不规则的观测点被映射到等间隔网格上,缺失位置自动变为 NaN,这为后续插值提供了明确的操作对象。

二、缺失值:先判断机制,再选择策略

缺失并非都该插值。短时掉线(如几分钟到数小时)可用线性或时间加权插值;长时间缺失(如数天)若强行插值会制造虚假的平滑信号,误导潮汐与日变化分析。实践中可先统计缺失比例与连续缺失长度,再分档处理:短缺口插值,长缺口标记为缺失段并在分析时剔除。

# 统计连续缺失长度
gap = ts.isna().astype(int)
groups = (gap != gap.shift()).cumsum()
gap_len = ts.isna().groupby(groups).sum()

# 仅对不超过 6 个网格点(1 小时)的缺口做时间插值
ts_filled = ts.interpolate(method="time", limit=6, limit_area="inside")

method="time" 按时间间隔加权,比默认的等距线性插值更符合不规则采样后的真实间隔;limit_area="inside" 避免在序列首尾外推。

三、异常值:结合海洋物理约束识别

纯统计方法(如3σ准则)在海洋数据上容易失效,因为潮汐和日变化本身就是大幅度的周期波动,会被误判为异常。更稳妥的做法是物理阈值 + 滑动统计双约束:先按传感器量程和海域常识设定硬边界(如海表温度 −2~35 ℃、盐度 0~40),再用滑动窗口中位数与 MAD 识别局部尖峰。

# 物理阈值
ts_filled = ts_filled.where((ts_filled > -2) & (ts_filled < 35))

# 滑动中位数 + MAD 识别局部尖峰
med = ts_filled.rolling("3h", center=True).median()
mad = (ts_filled - med).abs().rolling("3h", center=True).median()
outlier = (ts_filled - med).abs() > 5 * 1.4826 * mad
ts_clean = ts_filled.mask(outlier)

被标记的点应置为 NaN 而非直接删除行,这样时间网格保持完整,随后可再走一次短缺口插值流程。1.4826 是使 MAD 与标准差可比的换算系数,5 倍阈值适合保留潮汐与日变化的正常振幅。

四、清洗流程的整体结构

把上述环节串起来,就形成一条针对海洋数据特点的清洗流水线。下图展示了从原始浮标记录到可用时间序列的处理链,以及各环节的判断分支:

浮标时间序列清洗流水线 原始浮标记录 字符串时间/多时区 统一时间索引 UTC + 去重 + 排序 规则重采样 10min 网格 + 聚合 缺口长度 ≤1h ? 时间加权插值 limit=6, inside 保留为缺失段 分析时剔除 物理阈值 + MAD 尖峰 异常点置 NaN 回到插值环节 清洗后时间序列 索引唯一 · 间隔规则 · 数值可信 是 否 命中 通过

五、浮标数据清洗实战

假设某近岸浮标每 10 分钟记录一次海表温度,原始文件包含 30 天数据,存在三类问题:时间列为本地时间字符串、若干时刻重复、以及一次持续 8 小时的传感器掉线。按上述流程处理后,可得到一条 4320 点的规则序列。判断清洗是否成功,可检查三个指标:索引是否唯一且等间隔、缺失比例是否在可接受范围、清洗前后序列的日均值与潮汐振幅是否保持稳定。若异常值处理过度,潮汐振幅会明显缩小,这提示 MAD 阈值过严,应适当放宽。

对潮汐和日变化显著的变量,异常检测窗口应至少覆盖一个完整周期(如 25 小时),否则滑动统计会把正常相位变化误判为异常。
不要用全局均值填充长缺口,也不要在插值后再做重采样,否则会引入二次平滑,削弱真实的高频信号。

完成清洗后,建议把处理参数(重采样间隔、插值上限、MAD 倍数、物理阈值)与清洗日志一并保存,使整条流水线可复现、可审计,这也是海洋观测数据质量控制的通行做法。