преобразовать все переменные и размеры из int / float в double в файле netcdf

У меня есть файл netCDF со следующим содержанием. ncdump:

netcdf nc_data {
dimensions:
    lon = 1440 ;
    bounds = 2 ;
    lat = 720 ;
    time = UNLIMITED ; // (6 currently)
variables:
    double lon_bounds(lon, bounds) ;
    double lat_bounds(lat, bounds) ;
    int time(time) ;
        time:units = "year as %Y.%f" ;
        time:calendar = "proleptic_gregorian" ;
        time:long_name = "time" ;
        time:standard_name = "time" ;
        time:axis = "T" ;
    float lat(lat) ;
        lat:units = "degrees_north" ;
        lat:long_name = "latitude" ;
        lat:standard_name = "latitude" ;
        lat:axis = "Y" ;
        lat:bounds = "lat_bounds" ;
    float lon(lon) ;
        lon:units = "degrees_east" ;
        lon:long_name = "longitude" ;
        lon:standard_name = "longitude" ;
        lon:axis = "X" ;
        lon:bounds = "lon_bounds" ;
    float valf(time, lat, lon) ;
        valf: standard_name = “area_fraction”
        valf:missing_value = -9999.f ;
        valf:_fillvalue = -9999.f ;
        valf:long_name = "val fraction" ;
        valf:units = "fraction of grid cell" ;
}

Есть ли команда nco для преобразования всех переменных и размеров из int / float в double?

Я нашел это:

ncap2 -s 'valf=double(valf)' nc_data.nc nc_data.nc

Однако это работает только с одной переменной за раз, и у меня в файле ~ 30 переменных.


person user308827    schedule 20.04.2016    source источник


Ответы (1)


ncap2 может сделать это элегантно, хотя для этого требуется текущий снимок (который вскоре станет 4.6.0). Обратите внимание, что команда, которую вы использовали выше, не изменяет тип переменной в выходном файле, начиная с версии NCO 4.5.3, и текущий моментальный снимок позволяет ей работать. (Промежуточные версии ncap2 требуют, чтобы имя выходной переменной отличалось от имени входной, чтобы изменить ее тип, например, val_dbl=double(valf).

Важно отметить, что текущий снимок ncap2 понимает списки переменных. Таким образом, вы можете создать выходной файл определенных переменных с измененными именами с помощью этого скрипта:

@all=get_vars_in();
*[email protected]();

for(idx=0;idx<sz;idx++){

  @var_nm=sprint(@all(idx));

  if( *@var_nm.type() == NC_INT || *@var_nm.type() == NC_FLOAT )
   *@var_nm=*@var_nm.double();

}

Переименование переменных не требуется.

person Charlie Zender    schedule 22.04.2016