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% 分位差异常大且集中在固定纬度带,需回查基准的插值方式。
空间分布检查:用一张图定位虚假距平区
下图把“计算链”与“检查判读”放在同一视图中:左侧是距平生成的数据流与掩膜约束,右侧是三类典型虚假距平区的空间特征与对应排查方向。检查时优先看边界连续性(陆地/海域交界、基准拼接缝)与沿岸梯度(近岸缓冲区是否被误算),再看极值是否成片出现。
判读与修正:把“看起来异常”变成“可解释的异常”
完成上述检查后,按以下顺序处理:
- 先看掩膜一致性:若虚假区沿陆地边界或近岸缓冲区呈条带状,优先核对
coastal_mask与观测、基准的网格是否同分辨率、同原点;不同分辨率时需先重采样掩膜,而不是重采样距平。 - 再看基准覆盖:若虚假区沿固定经线或纬度带出现,检查气候态是否由多源数据拼接;拼接处应做平滑过渡或改用统一来源的基准。
- 最后看时间对齐:闰年、候平均基准与逐日观测混用时,2月末至3月初易出现系统性偏差;统一到 dayofyear 并显式处理2月29日可消除该类伪异常。
检查指标建议与历史同期对比而非绝对阈值:同一海域不同季节的空间梯度差异明显,用“本期 d_lat 相对历史同期中位数的倍数”判断更稳健。
不要用距平场自身的均值去“中心化”后再做检查——这会掩盖基准整体偏移导致的虚假距平,应先确认基准与观测的单位、参考面和覆盖范围一致。
完成本节后,应得到一份经过掩膜约束、时间对齐且通过三项空间检查的 sst_anom.nc,其中的距平场可直接作为后续阈值初筛与百分位识别的输入。