DKRZ Python example read GRIB file using xarray#

Example script:

#
#  File:
#    read_GRIB_with_xarray_cfgrib.py
#
#  Synopsis:
#    Illustrates how to read a GRIB file with xarray.
#
#  Description:
#    This example shows how to read a GRIB file using xarray / cfgrib.
#
#  Author:
#    Karin Meier-Fleischer
#
#  Date of initial publication:
#    September, 2019
#
'''
  PyEarthScience:   read_GRIB_with_xarray_cfgrib.py

  Description:
    Demonstrate the use of xarray/cfgrib to open and read the content of
    a GRIB file.

  - xarray / cfgrib
  - GRIB

  2019-01-22  kmf
'''

from __future__ import print_function
import cfgrib
import xarray as xr
import Ngl, os

#-----------------------------------------------------------------------
#-- Function: main
#-----------------------------------------------------------------------
def main():

    #-- data directory and file name, we use an example GRIB file from the NCL package
    ncarg  = Ngl.pynglpath("data")
    fname  = ncarg+'/grb/MET9_IR108_cosmode_0909210000.grb2'

    #--  open file
    ds = xr.open_dataset(fname, engine='cfgrib')

    print('------------------------------------------------------')
    print()
    print('--> ds:              ', ds)
    print()

    #-- print file variables
    print('------------------------------------------------------')
    print()
    print('--> file variables:  ', ds.variables)
    print()

    #-- read variable 'p260532'
    var  = ds.variables['p260532']

    #-- print variable information
    print('------------------------------------------------------')
    print()
    print('--> var')
    print()
    print(var)
    print()

    #-- print the size and shape of the variable
    print('------------------------------------------------------')
    print()
    print('--> var.dims           ',var.dims)

    #-- print the size and shape of the variable
    print('------------------------------------------------------')
    print()
    print('--> var.size           ',var.size)
    print('--> var.shape          ',var.shape)

    #-- read variables lat and lon
    lat  = ds.variables['latitude']
    lon  = ds.variables['longitude']

    #-- print the size of the coordinates
    nlat = len(lat[0])
    nlon = len(lat[1])
    print('------------------------------------------------------')
    print()
    print('--> lat:               %8d %8d' % (lat.shape[0],lat.shape[1]))
    print('--> lon:               %8d %8d' % (lon.shape[0],lon.shape[1]))
    print()

    #-- print the minimum and maximum of lat and lon
    print('------------------------------------------------------')
    print()
    print('--> lat min             ', lat.min().values)
    print('--> lat max             ', lat.max().values)
    print('--> lon min             ', lon.min().values)
    print('--> lon max             ', lon.max().values)
    print()

    #-- get the attribute content
    lat_spol = var.attrs['GRIB_latitudeOfSouthernPoleInDegrees']
    lon_spol = var.attrs['GRIB_longitudeOfSouthernPoleInDegrees']

    #-- retrieve the name of the coordinates lat/lon and the values of
    #-- the shape of the coordinates
    dimslat  = lat.dims[0]
    shapelat = lat.shape[0]
    dimslon  = lon.dims[0]
    shapelon = lon.shape[0]
    nrlat    = shapelat
    nrlon    = shapelon

    print('------------------------------------------------------')
    print()
    print('--> dimslat: ',dimslat, '  dimslon: ',dimslon,'  nrlat: ',nrlat,'  nrlon: ',nrlon)
    print()

    #-- print the variable attributes
    print('------------------------------------------------------')
    print()
    print('--> attributes:       ',var.attrs)
    print()

    #-- print the variable values
    print('------------------------------------------------------')
    print()
    print('--> values            ')
    print()
    print(var.values)
    print()

    #-- print the type of the variable p260532 (DataArray)
    print('------------------------------------------------------')
    print()
    print('--> type(var)         ',type(var))
    print()

    #-- print the type of the variable p260532 values (numpy.ndarray)
    print('------------------------------------------------------')
    print()
    print('--> type(var.values)  ',type(var.values))
    print()

    #-- select variable p260532 from dataset for first timestep
    print('------------------------------------------------------')
    print()
    print('--> dataset variable p260532 (y=0)')
    print()
    print(ds.p260532.isel(y=0).values)
    print()

    #-- select variable p260532 from dataset, lat index 1 and lon index 2
    print('------------------------------------------------------')
    print()
    print('--> dataset variable p260532 select data which is closest to y=1 and x=2')
    print()
    print(ds.p260532.isel(y=1, x=2).values)
    print()

    #-- select a sub-region (slice)
    print('------------------------------------------------------')
    print()
    print('--> select sub-region')
    print()
    print(ds.p260532.sel(y=slice(20, 0), x=slice(-25, 0)))
    print()

    #-- print dataset minimum/maximum: prints the name of the variables,
    #-- their types and minimum value
    print('------------------------------------------------------')
    print()
    print('--> print dataset min')
    print()
    print(ds.min().values)
    print()
    print('--> print dataset max')
    print()
    print(ds.max().values)
    print()

    #-- print median values of variable p260532 of dataset, one value for each level
    print('------------------------------------------------------')
    print()
    print('--> variable p260532 median')
    print()
    print(ds.p260532.median(dim=['y', 'x']).values)
    print()

    #-- compute the means of the variable p260532 of the dataset, one value for each level
    print('------------------------------------------------------')
    print()
    print('--> variable p260532 mean')
    print()
    mean = ds.p260532.mean(dim=['y', 'x'])
    print(mean.values)
    print()

if __name__ == '__main__':
    main()