如何用CDO实现基于百分位数、至少连续3天的热浪计算?
用CDO计算连续3天及以上的热浪事件
你的方法不完全符合连续至少3天的判定标准,问题出在对连续高温日的标记逻辑上:
- 第一步
cdo ge infile.nc 90thpctl.nc 1.nc是正确的,生成的文件中高温日标记为1,非高温日为0。 - 但
runsum,3计算的是每个格点连续3天的0/1总和,比如连续3天高温(1,1,1)的runsum结果是1,2,3;连续4天高温(1,1,1,1)的runsum结果是1,2,3,3。 - 后续
gec,3只会标记runsum等于3的日期,这会导致你只统计到连续高温段的最后1-2天,漏掉前面的天数,最终timsum得到的总天数远少于实际热浪覆盖的天数。
正确的CDO处理流程
要完整标记所有连续3天及以上的高温日,需要先识别连续高温段的起始点,再扩展标记整个段内的所有日期:
- 标记单日高温
cdo ge infile.nc 90thpctl.nc hot_days.nc
- 识别连续3天高温的起始点并扩展标记
# 标记连续3天高温的起始位置(当连续3天都是1时,起始日的runmin,3结果为1) cdo runmin,3 hot_days.nc start_points.nc # 向前扩展标记,覆盖整个连续高温段 cdo runmax,3 start_points.nc temp.nc # 反向再做一次runmax,3,避免遗漏长连续段的末尾日期 cdo runmax,3 -reverse temp.nc -reverse heatwave_days.nc
- 统计热浪总天数
cdo timsum heatwave_days.nc total_heatwave_days.nc
如果需要统计热浪事件的次数(而非总天数),直接对start_points.nc执行timsum即可,每个起始点对应一次独立的热浪事件。
内容的提问来源于stack exchange,提问作者Gayatri Prasad Adhikari
相关产品推荐
相关产品推荐

