Определите единицы измерения в файле netcdf с помощью python

Я создаю файл netcdf с несколькими переменными. Я получил свой файл netcdf настолько полезным, насколько и ожидал, но я не знаю, как определить единицы измерения моих переменных.

Вот как выглядит мой код прямо сейчас:

import netCDF4
import numpy as np

ncfile = netCDF4.Dataset('state.global.nc', 'r')
u = ncfile.variables['U'][:,:,:,:] # [T,Z,Y,X]
v = ncfile.variables['V'][:,:,:,:]
nx = np.shape(u)[3] - 1
ny = np.shape(v)[2] - 1
nz = np.shape(u)[1]

u_c = 0.5 * (u[:,:,:,0:nx] + u[:,:,:,1:nx+1])
v_c = 0.5 * (v[:,:,0:ny,:] + v[:,:,1:ny+1,:])

u_center = np.fliplr(u_c) # Flip upside down
v_center = np.fliplr(v_c)

# Write out u_center and v_center into a new netCDF file
ncfile_out = netCDF4.Dataset('./output.nc', 'w')
ncfile_out.createDimension('X', nx)
ncfile_out.createDimension('Y', ny)
ncfile_out.createDimension('Z', nz)

ncfile_out.createDimension('time', None)
u_out = ncfile_out.createVariable('u_center', 'f4', ('time', 'Z', 'Y', 'X'))
v_out = ncfile_out.createVariable('v_center', 'f4', ('time', 'Z', 'Y', 'X'))
time = ncfile_out.createVariable('Time', 'i4', 'time')

v_out.units = 'm/s' # Define units of variables
u_out.units = 'm/s'
time.units = 's'

u_out[:,:,:,:] = u_center[:,:,:,:]
v_out[:,:,:,:] = v_center[:,:,:,:]
ncfile_out.close()

Но я прочитал окончательный файл с помощью ncview и не вижу никаких единиц, и я хотел бы также определить единицы измерения (x, y, z) как «метры». Как я могу это сделать? И что, если я захочу поставить этот 1 шаг в «X» примерно как «500 метров»?


person Alejandro Jiménez Rico    schedule 07.06.2016    source источник


Ответы (1)


Способ определения ваших единиц измерения — это атрибуты в файле netCDF.

Хотя вы можете сделать это любым способом, который вам нравится, лучше всего придерживаться соглашений netCDF и определить текстовый атрибут с именем «единицы» для переменной и ввести единицы СИ.

Вот хороший пример: http://schubert.atmos.colostate.edu/~cslocum/netcdf_example.html

Единицы определяются таким кодом:

w_nc_var.setncatts({'long_name': u"mean Daily Air temperature",\
                'units': u"degK", 'level_desc': u'Surface',\
                'var_desc': u"Air temperature",\
                'statistic': u'Mean\nM'})

(Приведенный выше код также определяет другие атрибуты, но вы можете видеть, что он устанавливает для «единиц» значение «degK».)

Пакет udunits может помочь, если вам нужны преобразования между единицами измерения. Это также хорошее место, чтобы получить аббревиатуру для использования в вашем подразделении.

Удуниц тоже из Unidata, тех же людей, которые поддерживают netCDF.

http://www.unidata.ucar.edu/software/udunits/

person Edward Hartnett    schedule 12.06.2016