переименование измерения в файле netcdf - PullRequest
0 голосов
/ 04 июня 2018

Я новичок с nco, и я был бы признателен за некоторые советы относительно моего рабочего процесса и за помощь в решении проблемы, с которой я борюсь.

У меня есть эти данные , которые содержат 3Dзначения солености на двух разных временных шагах:

dimensions:
    t = 780 ;
    z = 54 ;
    y = 450 ;
    x = 3600 ;
variables:
    double time(t) ;
        time:units = "days since 1-1-1 00:00:0.0" ;
    float level(z) ;
        level:units = "[m]" ;
    float lat(y) ;
    float lon(x) ;
    float salt(x, y, z) ;
        salt:units = "psu * 1000 + 35" ;
        salt:missingvalue = "-1.0E34" ;
        salt:longname = "salinity" ;

Я хочу объединить два файла netcdf.

Для этого я сначала использую ncecat *.nc -O merged.nc:

dimensions:
    record = UNLIMITED ; // (2 currently)
    t = 780 ;
    z = 54 ;
    y = 450 ;
    x = 3600 ;
variables:
    double time(record, t) ;
        time:units = "days since 1-1-1 00:00:0.0" ;
    float level(record, z) ;
        level:units = "[m]" ;
    float lat(record, y) ;
    float lon(record, x) ;
    float salt(record, x, y, z) ;
        salt:units = "psu * 1000 + 35" ;
        salt:missingvalue = "-1.0E34" ;
        salt:longname = "salinity" ;

где теперь переменная time и размерность t являются ложными.Итак, я удаляю их с помощью ncks -O -x -v time merged.nc merged.nc:

    record = UNLIMITED ; // (2 currently)
    y = 450 ;
    z = 54 ;
    x = 3600 ;
variables:
    float lat(record, y) ;
    float level(record, z) ;
        level:units = "[m]" ;
    float lon(record, x) ;
    float salt(record, x, y, z) ;
        salt:units = "psu * 1000 + 35" ;
        salt:missingvalue = "-1.0E34" ;
        salt:longname = "salinity" ;

Теперь я хочу переименовать измерение record с помощью: ncrename -d record,time merged.nc.Команда выполняется без ошибок или предупреждений.Но когда я ncdump -h merged.nc получаю эту ошибку :

ncdump: merged.nc: NetCDF: ошибка HDF

Что это значит?Где я могу ошибаться?

РЕДАКТИРОВАТЬ

После ответа, отправленного Чарли Зендер

ncecat -O -u time *.nc merged.nc
ncks -O -x -v time merged.nc merged.nc

результат:

dimensions:
    time = UNLIMITED ; // (2 currently)
    y = 450 ;
    z = 54 ;
    x = 3600 ;
    t = 780 ;
variables:
    float lat(time, y) ;
    float level(time, z) ;
        level:units = "[m]" ;
    float lon(time, x) ;
    float salt(time, x, y, z) ;
        salt:units = "psu * 1000 + 35" ;
        salt:missingvalue = "-1.0E34" ;
        salt:longname = "salinity" ;
    double time(time, t) ;
        time:units = "days since 1-1-1 00:00:0.0" ;

// global attributes:
        :history = "Tue Jun  5 09:08:25 2018: ncks -O -x -v time merged.nc merged.nc\nTue Jun  5 09:08:19 2018: ncecat -O -u time OFES_salt_mmean_607.nc OFES_salt_mmean_608.nc merged.nc" ;
        :NCO = "netCDF Operators version 4.7.4 (http://nco.sf.net)" ;
        :nco_openmp_thread_number = 1 ;

1 Ответ

0 голосов
/ 04 июня 2018

Во-первых, я рекомендую команду

ncecat -O -u time *.nc merged.nc

, которая предотвращает необходимость переименования record в time.Тогда

ncks -O -x -v time merged.nc merged.nc

Это работает?

Ответ на вопрос EDIT:

Что касается ошибки, полученной с помощью ncrename, вы, возможно, столкнулись с ошибкой библиотеки netCDF4, описанной здесь .Рекомендуемое решение - преобразовать в netCDF3, переименовать, а затем преобразовать обратно в netCDF4, если необходимо:

ncks -3 in.nc out.nc
ncrename -d record,time out.nc
ncks -4 out.nc out.nc
...