Я не очень хорош в 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
mask2, в этом случае содержит 1, если оригинал был> = 1, и 0 в противном случае, чтозатем сопоставляется с отсутствующим на втором шаге.
Я думаю, что вы можете передать все это в одну команду и избежать промежуточных файлов следующим образом:
cdo mul -setctomiss,0 -gec,1 mask.nc var.nc varmasked.nc
Еще одна вещь какСноска, на всякий случай, если она представляет интерес, также легко создать маску суши и моря на лету в CDO, используя встроенный набор топографических данных, согласно моему ответу здесь: NetCDF: Как замаскировать / отфильтроватьзначения не земельных участков в глобальном наборе данных, предпочтительно с использованием Python и / или NCO? Это может быть очень полезно, поскольку у вас иногда нет набора данных маски с тем же разрешением, и это позволяет вам точно переназначить маску более крупного масштаба.