crear netcdf

De Wikicima
Revisión a fecha de 12:29 18 ago 2022; Lluis.fita (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar
  1. Cafe de programacion CIMA/DCAO/IFAECI
  1. Ejemplo de como crear un fichero netCDF con python3
  1. Librerias

import numpy as np from netCDF4 import Dataset as NetCDFFile

  1. Parametros
  1. nombre fichero

ncfilen = 'test.nc'

  1. Dimensiones

dimx = 100 dimy = 50 dimz = 20 dimt = 8

  1. Datos de las proyeccion de los datos

ilon = -80. elon = -40. ilat = -30. elat = -50.

  1. presiones

presvals = [1000., 975., 950., 925., 900., 850., 800., 750., 700., 650., 600., 550., \

 500., 450., 400., 350., 300., 250., 200., 100.]
  1. tiempo
    1. reftime

reftime = '1949-12-01 00:00:00' timeu = 'hours'

    1. diferencia en timeu del 18 de Agosto de 2022, respecto el refdate de las unidades
    2. de tiempo

diffbasetime = 637392

              1. #######
    1. MAIN
   #######

onc = NetCDFFile(ncfilen, 'w')

  1. Creando las dimensiones (siguiendo convenciones CF, https://cfconventions.org/)

newdim = onc.createDimension('lon', dimx) newdim = onc.createDimension('lat', dimy) newdim = onc.createDimension('pres', dimz) newdim = onc.createDimension('height2', 1) newdim = onc.createDimension('height10', 1) newdim = onc.createDimension('time', None)

  1. Creando las variables dimensionales
  1. Asumimos proyeccion regular lon/lat (campos 1D de longitudes y latitudes)

newvar = onc.createVariable('lon', 'f', ('lon')) dlon = (elon - ilon)/(dimx-1) lons = np.arange(ilon, elon + dlon, dlon) newvar[:] = lons newvar.setncattr('standard_name', 'longitude') newvar.setncattr('long_name', 'Longitude') newvar.setncattr('units', 'degrees_east')

newvar = onc.createVariable('lat', 'f', ('lat')) dlat = (elat - ilat)/(dimy-1) lats = np.arange(ilat, elat + dlat, dlat) newvar[:] = lats newvar.setncattr('standard_name', 'latitude') newvar.setncattr('long_name', 'Latitude') newvar.setncattr('units', 'degrees_north')

newvar = onc.createVariable('height2', 'f', ('height2')) newvar[:] = 2. newvar.setncattr('standard_name', 'height') newvar.setncattr('lon_name', 'Height above ground') newvar.setncattr('units', 'm') newvar.setncattr('positive', 'up')

newvar = onc.createVariable('height10', 'f', ('height10')) newvar[:] = 10. newvar.setncattr('standard_name', 'height') newvar.setncattr('lon_name', 'Height above ground') newvar.setncattr('units', 'm') newvar.setncattr('positive', 'up')

newvar = onc.createVariable('pres', 'f', ('pres')) newvar[:] = np.array(presvals)*100. newvar.setncattr('standard_name', 'pressure') newvar.setncattr('lon_name', 'Pressure') newvar.setncattr('units', 'Pa') newvar.setncattr('positive', 'down')

newvar = onc.createVariable('time', 'f', ('time')) newvar[:] = np.arange(0, 24, 3) + diffbasetime newvar.setncattr('standard_name', 'time') newvar.setncattr('long_name', 'Time') newvar.setncattr('units', timeu + ' since ' + reftime) newvar.setncattr('calendar', 'gregorian')

  1. Variables

newvar = onc.createVariable('tas', 'f', ('time', 'height2', 'lat', 'lon'), \

 fill_value=1.e20)

tas = np.full((dimt, 1, dimy, dimx), 305.) newvar[:] = tas newvar.setncattr('standard_name', 'air_temperature') newvar.setncattr('long_name', 'temperature of the air') newvar.setncattr('units', 'K') newvar.setncattr('coordinates', 'time height2 lat lon')

newvar = onc.createVariable('uas', 'f', ('time', 'height10', 'lat', 'lon'), \

 fill_value=1.e20)

uas = np.full((dimt, 1, dimy, dimx), 5.) newvar[:] = uas newvar.setncattr('standard_name', 'eastward_wind') newvar.setncattr('long_name', 'eastward wind speed of the air') newvar.setncattr('units', 'ms-1') newvar.setncattr('coordinates', 'time height10 lat lon')

newvar = onc.createVariable('vas', 'f', ('time', 'height10', 'lat', 'lon'), \

 fill_value=1.e20)

vas = np.full((dimt, 1, dimy, dimx), 3.) newvar[:] = vas newvar.setncattr('standard_name', 'northward_wind') newvar.setncattr('long_name', 'northward wind speed of the air') newvar.setncattr('units', 'ms-1') newvar.setncattr('coordinates', 'time height10 lat lon')

newvar = onc.createVariable('zg', 'f', ('time', 'pres', 'lat', 'lon'), \

 fill_value=1.e20)

zg = np.full((dimt, dimz, dimy, dimx), 0.)

  1. Para el ejemplo, el primer nivel esta por encima de los 1000 hPa

zg[:,0,:,0:dimx//2] = 1.e20 newvar[:] = zg newvar.setncattr('standard_name', 'geopotential_height') newvar.setncattr('long_name', 'geopotential height') newvar.setncattr('units', 'm2s-2') newvar.setncattr('coordinates', 'time pres lat lon')

  1. Atributos globales

onc.setncattr('author', 'anonymous') onc.setncattr('institution1', 'Centro de ' + 'Investigaciones del Mar y la Atm' + \

 chr(243) + 'sfera (CIMA)')

onc.setncattr('university', 'Universidad de Buenos Aires (UBA)') onc.setncattr('institution2', 'Instituto Franco-Argentino sobre Estudios de Clima '+ \

 'y sus Impactos (CNRS, IRL-3351 IFAECI)')

onc.setncattr('version', '0.0')

Herramientas personales