Ежемесячная сумма дождливых дней по ежедневным данным с использованием операторов климатических данных (CDO)

У меня есть климатические данные с ежедневным временным разрешением, и я хотел бы подсчитать количество дней с осадками (например, более 1 мм в день) по месяцам и годам.

Я пробовал eca_pd,1 и eca_rr1, но эти команды возвращают итоги влажных дней за все годы.

Например, cdo eca_pd,1 infile outfile

Есть ли команда возвращать дождливые дни для каждого месяца и / или года?


person Derelict    schedule 23.04.2020    source источник


Ответы (3)


Эту задачу можно выполнить с помощью функции маскирования CDO.

Первый шаг - создать эквивалентный файл с 1, если P> порогового значения (1 мм / день в вашем случае), и 0 в противном случае. Для этого мы используем функцию gec "больше или равно" (или ge = "больше", если хотите):

cdo gec,1 input.nc mask.nc 

(при условии, что во входном файле единицы измерения - мм / день).

Затем вы можете просто суммировать эту маску за период (месяцы, годы и т. Д.), Который вы хотите, чтобы ваша статистика

cdo monsum mask.nc nwetdays_mon.nc 
cdo yearsum mask.nc nwetdays_year.nc

Конечно, вы можете передать это по конвейеру, если хотите сделать это в одной строке: например,

cdo monsum -gec,1 input.nc nwetdays_mon.nc 

Мы можем пойти еще дальше, если вы хотите разработать климатологию для конкретного месяца. Если у вас есть многолетний набор данных, вы можете использовать замечательные команды «ymonstat». Так, например, после того, как вы рассчитали месячный ряд дождливых дней выше, вы можете рассчитать среднее значение за каждый месяц с помощью

cdo ymonmean nwetdays_mon.nc nwetdays_mon_clim.nc

Затем вы можете отличить ряд от этой ежемесячной климатологии, чтобы получить аномалию дождливых дней в каждом месяце на протяжении ряда.

cdo ymonsub nwetdays_mon.nc nwetdays_mon_clim.nc nwetdays_mon_anom.nc

Надеюсь, это поможет!

(ps: я обычно всегда нахожу, что таким способом проще вычислять эти виды статистики напрямую с CDO, я редко обнаруживаю, что встроенные климатические функции вычисляют точно статистику как / как я хочу).

person Adrian Tompkins    schedule 13.05.2020
comment
Спасибо. На днях я смог решить эту проблему, используя тот же подход. - person Derelict; 14.05.2020
comment
извините, я был медленным, как-то пропустил этот вопрос с тегом cdo-Climate. - person Adrian Tompkins; 14.05.2020
comment
не беспокойтесь, и спасибо за раздел ymonmean "бонус"! - person Derelict; 14.05.2020

С помощью ncap2 NCO создайте двоичный флаг, а затем просуммируйте его в желаемых измерениях:

ncap2 -s 'rainy=(precip > 1);rainy_days=rainy.total($time)' in.nc out.nc
person Charlie Zender    schedule 23.04.2020
comment
Спасибо. Унтер-офицером не пользовался, но проверю. - person Derelict; 23.04.2020

Вы также можете сделать это в cf-python, по сути, используя ту же методологию, что и Пример CDO выше, но в среде Python с использованием где методы и collapse :

import cf

# Read the dataset
f = cf.read('filename.nc')[0]

# Mask out dry days (assuming that your data
#                    units are 'mm day-1' or 'kg m-2 day-1', etc.)
wet = f.where(cf.le(1), cf.masked)

# If the data are in units of 'metres/day', say, then you could do:
#   wet = f.where(cf.le(0.001), cf.masked)
# or
#   wet = f.where(cf.le(1, 'mm day-1'), cf.masked)
# etc.

# Count the wet day occurrences by month
count_monthly = wet.collapse('T: sample_size', group=cf.M())

# Count the wet day occurrences by year
count_yearly = wet.collapse('T: sample_size', group=cf.Y())

# Get the data as numpy arrays
print(count_monthly.array)
print(count_yearly.array)


# Count the wet day totals by month
wet_day_sum_monthly = wet.collapse('T: sum', group=cf.M())

# Count the wet day totals by year
wet_day_sum_yearly = wet.collapse('T: sum', group=cf.Y())
person dhassell    schedule 27.05.2020