4. SST距平场的计算与空间分布检查

距平场计算:先对齐基准,再做逐格点减法

本节的任务是把一份近岸SST格点场与例3产出的气候态基准对齐,逐格点计算距平,并通过空间分布检查识别“虚假距平区”。核心公式很简单:距平 = 观测SST − 同日气候态,但真正决定结果可信度的是三件事:时间轴对齐(闰年、候/日基准)、空间掩膜一致(陆地、缺测、近岸缓冲区)、以及基准本身的覆盖完整性。

下面给出一个可直接运行的最小实现,输入为两个 NetCDF 文件:观测场 sst_obs.nc(变量 sst,维度 time×lat×lon)与逐日气候态 sst_clim.nc(变量 sst_clim,维度 dayofyear×lat×lon)。示例使用 xarray 与 numpy,输出距平场并生成空间检查指标。

import numpy as np
import xarray as xr

# 1. 读取观测与基准
obs = xr.open_dataset("sst_obs.nc")["sst"]          # ℃, time×lat×lon
clim = xr.open_dataset("sst_clim.nc")["sst_clim"]   # ℃, dayofyear×lat×lon

# 2. 时间轴对齐:把观测时间映射到 dayofyear(闰年2月29日归并到2月28日)
doy = obs.time.dt.dayofyear
leap = obs.time.dt.is_leap_year & (obs.time.dt.month == 2) & (obs.time.dt.day == 29)
doy = xr.where(leap, 59, doy)   # 2月29日 → 第59天(2月28日)

# 3. 基准按 dayofyear 索引,广播到观测时间轴
clim_aligned = clim.sel(dayofyear=doy)

# 4. 空间掩膜:陆地、缺测、近岸缓冲区统一
mask = xr.open_dataset("mask.nc")["coastal_mask"]   # 1=有效海域, 0=排除
valid = mask.astype(bool) & obs.notnull() & clim_aligned.notnull()

# 5. 逐格点距平
anom = (obs - clim_aligned).where(valid)
anom.name = "sst_anom"
anom.attrs.update(units="℃", long_name="SST anomaly vs daily climatology")

# 6. 空间检查指标
# 6a. 空间连续性:相邻格点距平差的绝对值中位数
d_lat = abs(anom.differentiate("lat")).median(skipna=True)
d_lon = abs(anom.differentiate("lon")).median(skipna=True)
# 6b. 极值分布:分位数
q = anom.quantile([0.01, 0.05, 0.5, 0.95, 0.99], dim=("lat", "lon"))
# 6c. 沿岸梯度:沿近岸掩膜带的距平梯度均值
coast_grad = abs(anom.differentiate("lon")).where(mask == 1).mean(skipna=True)

print("d_lat median:", float(d_lat), "d_lon median:", float(d_lon))
print(q.to_dataframe().T)
print("coastal gradient mean:", float(coast_grad))

anom.to_netcdf("sst_anom.nc")

运行后应得到 sst_anom.nc 与三项检查指标。判断标准建议:d_lat、d_lon 的中位数应与该海域典型SST空间梯度同量级(近岸一般 0.05–0.3 ℃/格点);若某区域出现远高于此的跳变,往往意味着基准在该处存在拼接缝或掩膜不一致。分位数应大致对称,若 1% 与 99% 分位差异常大且集中在固定纬度带,需回查基准的插值方式。

空间分布检查:用一张图定位虚假距平区

下图把“计算链”与“检查判读”放在同一视图中:左侧是距平生成的数据流与掩膜约束,右侧是三类典型虚假距平区的空间特征与对应排查方向。检查时优先看边界连续性(陆地/海域交界、基准拼接缝)与沿岸梯度(近岸缓冲区是否被误算),再看极值是否成片出现。

距平场生成链 观测SST time×lat×lon 逐日气候态 dayofyear×lat×lon 空间掩膜 陆地/缺测/近岸带 对齐与约束 • 闰年2/29→第59天 • 基准按doy索引广播 • 掩膜取交集 • 缺测不参与减法 • 单位统一为℃ • 近岸缓冲区标记 • 输出距平场 距平场 anom = obs − clim 单位:℃ sst_anom.nc 空间分布检查与虚假区判读 ① 空间连续性 相邻格点距平差中位数 d_lat / d_lon ≈ 0.05–0.3 ℃ 异常:局部跳变 > 1 ℃ → 查基准拼接缝/掩膜错位 ② 极值分布 1%/5%/50%/95%/99% 分位 应大致对称、无固定纬度带 异常:99%分位成片出现 → 查基准插值/去趋势残留 ③ 沿岸梯度 近岸掩膜带距平梯度均值 与历史同期梯度对比 异常:沿岸出现条带状极值 → 查近岸缓冲区/陆地掩膜 典型虚假距平区形态(示意) A. 基准拼接缝 沿经线突变 B. 掩膜错位 沿岸条带极值 C. 缺测未屏蔽 块状异常高值

判读与修正:把“看起来异常”变成“可解释的异常”

完成上述检查后,按以下顺序处理:

  1. 先看掩膜一致性:若虚假区沿陆地边界或近岸缓冲区呈条带状,优先核对 coastal_mask 与观测、基准的网格是否同分辨率、同原点;不同分辨率时需先重采样掩膜,而不是重采样距平。
  2. 再看基准覆盖:若虚假区沿固定经线或纬度带出现,检查气候态是否由多源数据拼接;拼接处应做平滑过渡或改用统一来源的基准。
  3. 最后看时间对齐:闰年、候平均基准与逐日观测混用时,2月末至3月初易出现系统性偏差;统一到 dayofyear 并显式处理2月29日可消除该类伪异常。
检查指标建议与历史同期对比而非绝对阈值:同一海域不同季节的空间梯度差异明显,用“本期 d_lat 相对历史同期中位数的倍数”判断更稳健。
不要用距平场自身的均值去“中心化”后再做检查——这会掩盖基准整体偏移导致的虚假距平,应先确认基准与观测的单位、参考面和覆盖范围一致。

完成本节后,应得到一份经过掩膜约束、时间对齐且通过三项空间检查的 sst_anom.nc,其中的距平场可直接作为后续阈值初筛与百分位识别的输入。