Извлечь заданную переменную из нескольких файлов Netcdf и объединить в один файл

Я пытаюсь извлечь одну переменную (DUEXTTAU) из нескольких файлов ЧПУ, а затем объединить все отдельные файлы в один файл ЧПУ. Я использую nco, но у меня проблема с ncks.

Имена файлов NC следующие:

MERRA2_100.tavgM_2d_aer_Nx.YYYYMM.nc4

Каждый файл имеет 1 (ежемесячный) временной шаг, а временная координата не имеет реального значения, но изменяется в единицах или begin_date. Например, в файле MERRA2_100.tavgM_2d_aer_Nx.198001.nc4 есть:

    int time(time=1);
      :long_name = "time";
      :units = "minutes since 1980-01-01 00:30:00";
      :time_increment = 60000; // int
      :begin_date = 19800101; // int
      :begin_time = 3000; // int
      :vmax = 9.9999999E14f; // float
      :vmin = -9.9999999E14f; // float
      :valid_range = -9.9999999E14f, 9.9999999E14f; // float
      :_ChunkSizes = 1U; // uint

Я повторяю этот шаг для каждого файла

ncks -v DUEXTTAU MERRA2_100.tavgM_2d_aer_Nx.YYYYMM.nc4 YYYYMM.nc4

а потом

ncrcat YYYYMM.nc4 final.nc4

В final.nc4 координата time имеет то же значение (первого YYYYMM.nc4). Например, после объединения 3 файлов 198001, 198002 и 198003 координата time будет равна 198001 для всех временных шагов. Как мне с этим справиться?


person peteron30    schedule 17.05.2020    source источник
comment
помогло ли какое-либо из двух приведенных ниже решений? вы можете проголосовать за полезные ответы, а также принять лучший, поставив галочку   -  person Adrian Tompkins    schedule 01.10.2020


Ответы (2)


Во-первых, эта команда должна работать:

ncrcat -v DUEXTTAU MERRA2_100.tavgM_2d_aer_Nx.??????.nc4 final.nc4

Однако последние версии NCO не могут правильно восстановить или переустановить временную координату, когда time является целым числом, как в вашем случае. Исправление находится в последнем снимке состояния NCO на GitHub и будет в версии 4.9.3, которая, надеюсь, будет выпущена на этой неделе. Если установка из исходного кода невозможна, тогда потребуется ручное вмешательство (например, изменить time на значение с плавающей запятой в каждом входном файле с помощью ncap2 -s 'time=float(time)' in.nc out.nc). В любом случае атрибуты time_increment, begin_date и begin_time нестандартны и будут просто скопированы из первого файла. Но сам time должен быть правильно реконструирован, если вы используете исправную версию ncrcat.

person Charlie Zender    schedule 18.05.2020
comment
Спасибо @ charlie-zender. Команда сработала, но проблема с координатой времени все еще существует. Возможно, я неправильно понял проблему, но когда я открыл final.nc4 с помощью xarray и распечатал координату времени, я увидел следующее: ‹xarray.DataArray 'time' (time: 72)› array (['1980-01-01T00 : 30: 00.000000000 ',' 1980-01-01T00: 30: 00.000000000 ',' 1980-01-01T00: 30: 00.000000000 ',' 1980-01-01T00: 30: 00.000000000 ', ... - person peteron30; 19.05.2020
comment
Правильно ли задана информация в метаданных единиц измерения? Что вы получите, если попробуете cdo showtime и cdo showdata (или альтернативно cdo info) с исходными файлами для 198001, 198002 и 198003 ...? Если это правильно, я думаю, что cdo может справиться с разным базовым временем, но я думал, что это также относится к nco. - person Adrian Tompkins; 20.05.2020

вы также можете сделать это с помощью cdo, но вам потребуется два шага:

cdo mergetime MERRA2_100.tavgM_2d_aer_Nx.??????.nc4 merged_file.nc 
cdo selvar,DUEXTTAU merged_file.nc DUEXTTAU.nc 

Это действительно должно работать, если все даты начала установлены правильно. Проблема в том, что merged_file.nc на самом деле может быть массивным, и поэтому может быть лучше сначала выполнить цикл, чтобы извлечь переменную, а затем объединить:

for file in `ls MERRA2_100.tavgM_2d_aer_Nx.??????.nc4`; do 
    cdo selvar,DUEXTTAU $file ${file#????}_duexttau.nc4 
done 
cdo mergetime MERRA2_100.tavgM_2d_aer_Nx.??????_duexttau.nc4 DUEXTTAU.nc 
rm -f MERRA2_100.tavgM_2d_aer_Nx.??????_duexttau.nc4 # clean up
person Adrian Tompkins    schedule 19.05.2020