4. 数据清洗基础

海洋环境数据在进入分析之前,几乎不可能“开箱即用”。浮标观测、船测CTD、卫星遥感、数值模式输出,来源不同、采样频率不同、单位不同,还常常夹杂着仪器故障、通信丢包和人工录入错误。数据清洗的目标不是把数据“改得好看”,而是让每一条记录都能被追溯、被解释、被正确计算。本节围绕四件事展开:缺失值、异常值、重复记录、单位与时间格式,最后给出一份可执行的质量检查清单和一个完整的小案例。

一、先认识海洋数据中的“脏”从哪来

以温盐深(CTD)剖面和浮标时间序列为例,常见问题有:传感器漂移导致盐度缓慢偏移;生物附着使溶解氧读数逐渐偏低;通信中断造成整段时间缺测;不同航次单位混用(水温用℃,盐度用PSU,而某些模式输出盐度用g/kg);时间戳有的用UTC、有的用本地时,有的还是“年积日+秒”格式。清洗前应先建立一份“数据字典”,记录每个变量的物理含义、单位、有效范围、缺测标记(如-999、NaN、空字符串)和采样间隔。这一步决定了后面所有判断是否有依据。

二、缺失值:先判断类型,再决定处理方式

缺失不是一种情况。要区分完全随机缺失(如偶发通信丢包)、随机缺失(与其它变量相关,如高海况时部分传感器失效)和非随机缺失(如仪器到量程上限后不再输出)。处理方式取决于缺失比例和用途:

  • 删除:单变量缺失比例很低(例如小于5%)且分析不依赖该变量时,可删除对应记录;但整行删除会损失其它有效变量,需谨慎。
  • 插值:时间序列常用线性插值或三次样条,适合短时缺测(如连续缺测不超过3个采样点);剖面数据可按深度插值,但跨越跃层时应避免线性插值,否则会抹平梯度。
  • 标记而非填补:对用于统计频率或极值的分析,保留缺失标记、只在计算时跳过,往往比强行填补更诚实。

关键原则:任何填补都要新增一列“是否填补”标志,并在报告中说明方法,不能悄悄替换原始值。

三、异常值:物理范围、统计规则与上下文三管齐下

异常值检测不能只靠“3σ”。海洋变量有明确的物理边界:海水温度一般在-2℃到40℃之间,盐度约0到42,溶解氧非负。先做物理范围检查,能拦下大部分录入错误和量程溢出。再做统计检查,例如用四分位距(IQR)规则:低于Q1−1.5×IQR或高于Q3+1.5×IQR的点标记为疑似异常。最后做上下文检查:相邻时间点变化率是否合理,例如水温1分钟内跳变5℃几乎不可能,应结合采样间隔设定变化率阈值。

需要强调:被标记的点不等于错误。海洋中确实存在锋面、跃层和短时强对流,统计规则会把真实极值误判。因此异常值应分为“确认错误”(如盐度为负)和“待复核”(统计离群),前者修正或置为缺失,后者保留并标注,交由后续分析判断。

四、重复记录:按什么判重,决定了结果对不对

重复记录常见于多源合并和断点续传。判重不能只看整行是否完全相同,因为同一观测可能因单位换算或时间精度不同而“看起来不同”。合理做法是定义业务主键:例如“站点编号+观测时间+变量名”。若同一主键出现多条,再比较数值差异:完全一致则保留一条;差异在仪器精度内(如温度差小于0.01℃)可保留均值或首条;差异明显则说明存在冲突,应标记待查,而不是简单去重。时间戳要统一到同一时区和精度后再判重,否则同一时刻的UTC与本地时记录会被当成两条。

五、统一单位与时间格式:清洗中最容易被低估的一步

单位统一要落到“量纲+数值”两层。建议在数据字典中固定一套内部标准单位,例如温度统一为摄氏度、盐度统一为PSU、流速统一为m/s、时间统一为UTC的ISO 8601格式(YYYY-MM-DDTHH:MM:SSZ)。转换时保留原始列和转换公式,例如节转米每秒乘以0.514444,实用盐度与g/kg的换算需按具体定义处理,不能凭经验随意乘系数。时间格式统一包括:时区标注、闰年与月天数校验、年积日转换、以及采样间隔是否等距。转换完成后应抽查若干条记录,用已知事件(如某次台风过境时间)核对时间轴是否对齐。

海洋环境数据清洗:四类问题与质量闸门 原始数据 浮标 / CTD / 遥感 / 模式 ① 缺失值处理 识别缺测标记 → 判断缺失类型 删除 / 短时插值 / 保留标记 ② 异常值检测 物理范围 → IQR统计 → 变化率 确认错误修正,待复核保留标注 ③ 重复 记录 业务主键判重 ④ 单位与时间格式统一 内部标准单位 + UTC ISO 8601 保留原始列与转换公式 质量检查闸门 范围 / 缺测率 / 重复率 / 时间连续性 不通过则回溯定位问题来源 清洗后数据集 + 清洗日志 每条修改可追溯:原值、新值、依据 常见缺测标记 -999 / NaN / 空串 需在数据字典中登记 判重主键示例 站点+时间+变量 先统一时区再判重 异常值判断的三层依据 物理范围:温度 -2~40℃,盐度 0~42 统计规则:IQR 1.5 倍,标记疑似离群 上下文:变化率与采样间隔匹配 离群 ≠ 错误:锋面与跃层可能产生真实极值

六、数据质量检查清单(可直接套用)

下面这份清单按“检查项—判断依据—不通过时的动作”组织,适合在每次数据入库前执行。示例阈值属于常见教学设定,实际项目应按仪器精度和科学目标调整。

检查项判断依据(示例)不通过时的动作
缺测标记识别统计-999、NaN、空串出现次数统一转为标准缺失值并记录
单变量缺测率关键变量缺测率≤10%超限则评估是否剔除该变量或时段
物理范围温度-2~40℃,盐度0~42,溶解氧≥0越界值置为缺失并标记“确认错误”
统计离群超出Q1−1.5IQR或Q3+1.5IQR标记“待复核”,不直接删除
变化率相邻点变化不超过设定阈值结合采样间隔复核,确认后修正
重复记录按“站点+时间+变量”主键统计重复数一致则去重,冲突则标记待查
时间连续性采样间隔是否等距、有无跳变补齐时间轴或标注断档
单位一致性所有变量符合内部标准单位按公式换算并保留原始列
时区一致性全部为UTC并符合ISO 8601统一转换,抽查关键事件对齐

七、实战案例:一个浮标温盐序列的清洗闭环

假设某浮标提供2023年某月逐小时表层水温与盐度,共720条记录。初步检查发现:水温有12条为-999,盐度有3条为负值,另有8条记录时间戳重复,且部分水温数值疑似以华氏度录入。处理过程如下:

  1. 将-999统一转为缺失,统计水温缺测率约1.7%,未超过10%,保留时间轴。
  2. 盐度负值判定为确认错误,置为缺失并写入清洗日志。
  3. 按“站点+时间+变量”判重,8条重复中6条数值完全一致,保留首条;2条数值相差超过0.5,标记待查,暂不合并。
  4. 抽查发现某段水温在25~30之间而相邻时段在12~18之间,结合原始记录确认该段为华氏度,按(℉−32)×5/9换算为摄氏度,并保留原始列。
  5. 时间戳统一为UTC的ISO 8601格式后再次判重,确认无新的重复。
  6. 对水温做IQR检查,标记出2个待复核点,核对原始报文后确认是传感器短时跳变,置为缺失;盐度未发现统计离群。

清洗后有效水温记录约706条,盐度约717条,所有修改均可在日志中追溯。这个案例说明:清洗不是一次性“跑个脚本”,而是“检查—判断—处理—记录—复核”的闭环。真正决定数据质量的,往往不是算法多复杂,而是是否建立了清晰的判断依据和可追溯的处理记录。

建议把清洗日志设计成至少包含:记录主键、变量名、原值、新值、处理类型(缺失/异常/重复/单位/时间)、判断依据、处理时间。这样在后续分析出现异常时,能快速定位是原始问题还是清洗引入的问题。