如何用 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 文件,其缺测属性、网格定义、单位和时间覆盖是否满足上述条件仍需确认。
备注:内容仅供参考。
