PAYATHON 2026

如何用 CDO 计算降水超过 100 mm 的全球陆地面积百分比时间序列?

数据阿明

结论

用 gridarea 获取网格面积,再用 fldsum 累加超阈值网格的面积,思路是对的。原命令需要调整两处:按是否出现过有效值构造陆地掩膜,并将最后的面积比乘以 100,得到百分比。

以固定陆地总面积为分母时,某个时间步缺测的陆地区域仍会计入分母。算出的比例是已观测到的超阈值面积占固定区域的比例,能否代表真实比例取决于数据覆盖情况。

原命令有哪些问题?

掩膜判断的是累计降水量,不是有效数据是否存在

原命令:

cdo setmisstoc,0 -ltc,1e10 -timsum Prcp_1979-2025.nc landOnly.nc

这条命令先执行 timsum,再判断累计值是否小于 1e10。如果有效累计值均低于这个阈值,且缺测值被正确识别,就可能得到预期掩膜,但这个数值上限与掩膜定义无关。

可以将每个时间步的有效值标为 1、缺测值标为 0,再执行 timmax。这样,在整个时段内出现过有效值的网格最终都为 1。CDO 时间统计算子说明

这个掩膜实际表示数据覆盖范围。只有在海洋始终缺测、有效数据仅出现在陆地上的前提下,才能将它称为陆地掩膜;若海洋也有有效降水数据,还需要独立的陆海掩膜。

面积比还不是百分比

原来的 div 输出通常是 0—1 的比例。例如,0.12 对应 12%,需要再乘以 100。

原命令的输入文件 Area_extreme_rainfall.nc 与输出文件 area_extreme_rainfall.nc 仅大小写不同。在不区分大小写的文件系统上,两者可能指向同一个文件,应使用明显不同的文件名。

按固定陆地面积计算的示例

以下命令假设输入只包含待统计的降水变量、网格随时间不变,并且 CDO 已正确识别缺测值。若文件还包含其他数据变量,应先选择降水变量。

1. 选取研究时段并确认缺测值

cdo selyear,1979/2025 Prcp_1979-2025.nc prcp.nc

ncdump -h prcp.nc
cdo infon prcp.nc

检查降水变量的 _FillValue、missing_value,以及 infon 输出中的缺测数量。文件名包含年份并不能保证时间轴完整。

1.e+30f 必须被识别为缺测值。如果它仍被当作普通数值,gtc,100 就会把它判为超阈值降水。setmisstoc,0 只能替换已经识别的缺测值;未识别的哨兵值应先按实际存储值使用 setctomiss 等方式处理。setmissval 用于更换已有缺测值的标记,不能代替这一步。CDO 缺测值算子说明

2. 构造每个时间步的有效值掩膜及固定掩膜

cdo -b F64 setmisstoc,0 -addc,1 -mulc,0 prcp.nc valid_mask.nc
cdo timmax valid_mask.nc landOnly.nc

第一条命令从右侧开始处理:有效降水值乘以 0 后变为 0,加 1 后变为 1,缺测值最后替换为 0。第二条命令沿时间取最大值,得到整个时段内至少有效过一次的网格。

这里的 0 和 1 都是有效掩膜值,不应同时被设为缺测标记。

3. 计算固定区域的总面积

cdo -b F64 gridarea prcp.nc cell_area.nc
cdo -b F64 mul landOnly.nc cell_area.nc land_area_grid.nc
cdo -b F64 fldsum land_area_grid.nc total_land_area.nc

gridarea 给出网格单元面积,但不会根据降水数据自动筛选陆地,因此需要乘以掩膜,再用 fldsum 累加面积。这样保留了面积权重,避免直接统计网格数量造成偏差。CDO 官方支持中的面积计算说明

4. 逐时间步计算超阈值面积和百分比

cdo setmisstoc,0 -gtc,100 prcp.nc highrain_mask.nc

cdo -b F64 fldsum -mul highrain_mask.nc land_area_grid.nc highrain_area.nc

cdo -b F64 mulc,100 -div highrain_area.nc total_land_area.nc highrain_percent.nc

gtc,100 表示严格大于 100,不会包含恰好等于 100 的值。超阈值掩膜中的缺测位置被记为 0,这些位置不计入已观测到的超阈值面积。

固定掩膜和面积场只有一个时间步,作为第二输入用于整段时间序列的运算。输出 highrain_percent.nc 保留原降水数据的时间步频率;这些命令不会自动生成年度序列。

示例使用 -b F64 输出浮点结果,避免面积及比例计算受整数输出精度限制。还应检查结果变量的名称和单位,将百分比结果的单位设置为 %,不要直接沿用降水单位。

时间变化的缺测区域应如何处理?

上述固定分母方案对应:

[ P(t)=100\times\frac{\sum_i A_iL_iV_i(t)\mathbf{1}[p_i(t)>100]}{\sum_i A_iL_i} ]

其中,(A_i) 是网格面积,(L_i) 是固定掩膜,(V_i(t)) 表示该时间步是否有效。

如果希望回答“当前有有效数据的陆地区域中,多少面积超过阈值”,应改用逐时间步的有效面积作为分母:

cdo -b F64 fldsum -mul valid_mask.nc land_area_grid.nc valid_land_area.nc

cdo -b F64 mulc,100 -div highrain_area.nc -setctomiss,0 valid_land_area.nc highrain_percent_valid.nc

这里将为 0 的分母标为缺测,避免在完全没有有效观测时计算比例。

使用固定分母时,部分区域缺测会使结果低于或等于完整数据下的超阈值比例。某个时间步全部缺测时,上面的固定分母代码会输出 0,不能把它解释成“没有强降水”。应结合有效面积判断,并将完全缺测的时间步标为缺测。

运行前后还应检查什么?

  • 确认降水单位和时间含义。100 mm 可能对应日、月或其他累计时段;如果输入是降水率,需要先转换为目标时段的累计降水量。
  • 确认网格信息足以支持 gridarea。对于需要顶点信息的网格,应检查网格边界或使用可靠的现成面积数据。
  • 确认固定区域总面积大于 0,有效百分比应在 0—100 之间。
  • 只有在覆盖范围确实代表全球陆地时,结果才适合称为“全球陆地面积百分比”。

由于没有实际 NetCDF 文件,其缺测属性、网格定义、单位和时间覆盖是否满足上述条件仍需确认。

备注:内容仅供参考。