Xarray engine: squeezing dimensionsΒΆ

First, we get some GRIB forecast data on pressure levels and read it into a GRIB fieldlist.

[1]:
import earthkit.data as ekd

ds_fl = ekd.from_source("sample", "pl.grib").to_fieldlist()

By default, squeeze=True in to_xarray(). This means that if a dimension has only one value, it is removed from the dataset. E.g. in the following example the dimensions "member" and "level_type" are removed:

[2]:
ds_fl.to_xarray()
[2]:
<xarray.Dataset> Size: 176kB
Dimensions:                  (forecast_reference_time: 4, step: 2, level: 2,
                              latitude: 19, longitude: 36)
Coordinates:
  * forecast_reference_time  (forecast_reference_time) datetime64[ns] 32B 202...
  * step                     (step) timedelta64[ns] 16B 00:00:00 06:00:00
  * level                    (level) int64 16B 500 700
  * latitude                 (latitude) float64 152B 90.0 80.0 ... -80.0 -90.0
  * longitude                (longitude) float64 288B 0.0 10.0 ... 340.0 350.0
Data variables:
    r                        (forecast_reference_time, step, level, latitude, longitude) float64 88kB ...
    t                        (forecast_reference_time, step, level, latitude, longitude) float64 88kB ...
Attributes:
    Conventions:  CF-1.8
    institution:  ECMWF

When using squeeze=False these dimensions are added to the dataset.

[3]:
ds_fl.to_xarray(squeeze=False)
[3]:
<xarray.Dataset> Size: 176kB
Dimensions:                  (member: 1, forecast_reference_time: 4, step: 2,
                              level: 2, level_type: 1, latitude: 19,
                              longitude: 36)
Coordinates:
  * member                   (member) <U1 4B '0'
  * forecast_reference_time  (forecast_reference_time) datetime64[ns] 32B 202...
  * step                     (step) timedelta64[ns] 16B 00:00:00 06:00:00
  * level                    (level) int64 16B 500 700
  * level_type               (level_type) <U8 32B 'pressure'
  * latitude                 (latitude) float64 152B 90.0 80.0 ... -80.0 -90.0
  * longitude                (longitude) float64 288B 0.0 10.0 ... 340.0 350.0
Data variables:
    r                        (member, forecast_reference_time, step, level, level_type, latitude, longitude) float64 88kB ...
    t                        (member, forecast_reference_time, step, level, level_type, latitude, longitude) float64 88kB ...
Attributes:
    Conventions:  CF-1.8
    institution:  ECMWF

An alternative way to achieve this is to use the ensure_dims option.

[4]:
ds_fl.to_xarray(ensure_dims=["member", "level_type"])
[4]:
<xarray.Dataset> Size: 176kB
Dimensions:                  (member: 1, forecast_reference_time: 4, step: 2,
                              level: 2, level_type: 1, latitude: 19,
                              longitude: 36)
Coordinates:
  * member                   (member) <U1 4B '0'
  * forecast_reference_time  (forecast_reference_time) datetime64[ns] 32B 202...
  * step                     (step) timedelta64[ns] 16B 00:00:00 06:00:00
  * level                    (level) int64 16B 500 700
  * level_type               (level_type) <U8 32B 'pressure'
  * latitude                 (latitude) float64 152B 90.0 80.0 ... -80.0 -90.0
  * longitude                (longitude) float64 288B 0.0 10.0 ... 340.0 350.0
Data variables:
    r                        (member, forecast_reference_time, step, level, level_type, latitude, longitude) float64 88kB ...
    t                        (member, forecast_reference_time, step, level, level_type, latitude, longitude) float64 88kB ...
Attributes:
    Conventions:  CF-1.8
    institution:  ECMWF
[ ]: