我不太擅长 NCO,但我认为您也可以在 CDO 中轻松做到这一点,并会在此基础上冒险提出替代答案。你没有在你的问题中清楚地说明掩码到底是什么以及你想如何掩码,但是从你的代码中我推断出
- 掩码文件有一个介于 0 和 1 之间的浮动变量
- 您只想保留 mask=1 的变量值,并将其他所有内容设置为缺失(而不是零)?
如果是这种情况,那么您可以这样做:
cdo setrtomiss,-999,0.999 mask.nc maskmiss.nc
cdo mul maskmiss.nc var.nc varmasked.nc
第一行设置一个缺少 0.999 及以下的掩码,否则保持该值不变,第二行相乘。如果一个文件只有一个时间步长,CDO 通过重复自动“填充”丢失的时间段,从而解决您的问题。如果您担心四舍五入(或者您的掩码的值 > 1),那么更安全的掩码定义将是
cdo gec,1 mask.nc mask2.nc
cdo setctomiss,0 mask2.nc mask3.nc
在这种情况下,如果原始值 >=1,则 mask2 包含 1,否则为 0,然后在第二步中将其映射到缺失。
我认为您可以在一个命令中传递整个内容,并以这种方式避免中间文件:
cdo mul -setctomiss,0 -gec,1 mask.nc var.nc varmasked.nc
最后一件事作为脚注,以防万一,使用内置地形数据集在 CDO 中动态创建海陆掩膜也很容易,根据我在此处的回答:NetCDF:如何掩蔽/过滤掉全局数据集中的非土地值,最好使用 Python 和/或 NCO? 这可能非常有用,因为您有时没有相同分辨率的掩码数据集,它可以帮助您准确地重新映射较粗的比例掩码。