Усреднение нескольких файлов netCDF4 с помощью python

Я немного разбираюсь в netCDF в Python, поэтому, пожалуйста, извините за этот нубский вопрос.

У меня есть папка, заполненная примерно 3650 файлами netCDF4. Один файл в день в течение десятилетия. нилы называются yyyymmdd.nc (например, 20100101, 20100102, 20100103 и т. д.). Каждый файл .nc содержит широту, долготу и температуру в определенный момент времени для одной и той же области — части ИЭЗ Тонги.

Что я пытаюсь сделать, так это вычислить среднюю температуру для каждой широты и долготы из всех файлов, т. Е. Я хочу получить один файл .nc, который имеет все те же широту и долготу и среднюю температуру за 10 лет.

Я пробовал разные вещи/версии кода, обычно они выглядят примерно так.....

files = glob('*.nc')
ds = xr.open_mfdataset(files,)
mean = np.mean(ds['temp'][:, 0].values)

...... Этот код даст мне среднюю температуру в файле .nc для всех файлов .nc, а не среднюю температуру, основанную на широте и долготе файлов за десятилетие.

Любая помощь приветствуется.

Спасибо.


person kawakawa    schedule 07.06.2021    source источник
comment
У меня такое чувство, что mean = np.mean(ds['temp'][:, 0].values) не очень хороший подход, так как вы уже тогда вырезали некоторые данные. Каковы размеры ds['temp']? mean = np.mean(ds['temp'][:].values,axis=0) работает?   -  person msi_gerva    schedule 07.06.2021


Ответы (2)


Если вы работаете с Linux/macOS, это можно легко сделать с помощью моего пакета nctoolkit (подробности см. здесь) .

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

import nctoolkit as nc
files = glob('*.nc')
ds = nc.open_data(file)
ds.ensemble_mean()
ds.plot()

nctoolkit по умолчанию использует CDO в качестве серверной части, но также может использовать NCO, что может привести к повышению производительности. Таким образом, следующее может быть быстрее:

import nctoolkit as nc
files = glob('*.nc')
ds = nc.open_data(file)
ds.ensemble_mean(nco=True)
ds.plot()
person Robert Wilson    schedule 07.06.2021
comment
это работает как шарм. палец вверх для nctoolkit. - person kawakawa; 15.06.2021
comment
Привет Роберт. еще раз спасибо, что познакомили меня с этим. nctookit действительно упрощает мне жизнь. У меня есть быстрый дополнительный вопрос. используя ds.ensemble, я также могу рассчитать стандартное отклонение. Я пробовал ds.ensemble_stdev(nco=True), но эта ошибка с stdev не найдена. - person kawakawa; 30.06.2021
comment
Спасибо. В минуту нет. Но я могу реализовать это относительно легко. Если вам срочно нужен этот функционал, вы можете задать вопрос здесь github.com/pmlmodelling/nctoolkit/issues и я могу быстро добавить его в версию для разработчиков - person Robert Wilson; 01.07.2021

Вы можете использовать пакет cdo, чтобы сделать это, используя подстановочный знак в имени входного файла. Я тестировал его только с небольшим количеством файлов, но есть одно предостережение: вы можете столкнуться с системным ограничением на количество открытых файлов.

from cdo import *
cdo=Cdo()
cdo.ensmean(input='*.nc',output='ensmean.nc')

Это в основном эквивалент вызова командной строки для cdo

cdo ensmean *.nc ensmean.nc 

Тем не менее, мне кажется, что было бы лучше свести их вместе, а затем использовать timmean:

cdo.timmean(input=cdo.mergetime(input='*.nc'),output='timmean.nc')

что снова является эквивалентом python

cdo mergetime *.nc all.nc
cdo timmean all.nc timmean.nc 

попробуйте оба и посмотрите, какой из них работает/быстрее :-)

person Adrian Tompkins    schedule 09.06.2021