Xarray engine: hypercube with holes

This notebook demonstrates how to work with input data not forming a full hypercube.

First, we get pressure level GRIB data with t, u and v variables, where u only contains the subset of the levels in t and v. This data forms a hypercube with holes.

[1]:
import earthkit.data as ekd

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

Converting the input to Xarray with to_xarray() fails because holes are not allowed by default.

[2]:
try:
    ds_fl.to_xarray()
except ValueError as e:
    import textwrap

    print(textwrap.fill(str(e), 100))
Variable "u" has inconsistent dimension "vertical.level" compared to other variables. Expected
values: (6) [300, 400, 500, 700, 850, 1000], got: (2) [500, 700]. Length mismatch: 6 != 2

We need to use the allow_holes=True option to make the conversion work.

[3]:
ds = ds_fl.to_xarray(allow_holes=True)
ds
[3]:
<xarray.Dataset> Size: 12kB
Dimensions:    (level: 6, latitude: 7, longitude: 12)
Coordinates:
  * level      (level) int64 48B 300 400 500 700 850 1000
  * latitude   (latitude) float64 56B 90.0 60.0 30.0 0.0 -30.0 -60.0 -90.0
  * longitude  (longitude) float64 96B 0.0 30.0 60.0 90.0 ... 270.0 300.0 330.0
Data variables:
    t          (level, latitude, longitude) float64 4kB ...
    u          (level, latitude, longitude) float64 4kB ...
    v          (level, latitude, longitude) float64 4kB ...
Attributes:
    Conventions:  CF-1.8
    institution:  ECMWF

The resulting dataset works as expected but when we slice into the holes NaNs are returned.

[4]:
ds.u.sel(level=300).values
[4]:
array([[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]])
[5]:
ds.u.sel(level=[500, 300]).values
[5]:
array([[[  4.74000549,   4.74000549,   4.74000549,   4.74000549,
           4.74000549,   4.74000549,   4.74000549,   4.74000549,
           4.74000549,   4.74000549,   4.74000549,   4.74000549],
        [ 12.74000549,   4.74000549,   4.74000549,  28.74000549,
          12.74000549,  -3.25999451,   4.74000549,   4.74000549,
           4.74000549,  12.74000549,  20.74000549,   4.74000549],
        [ -3.25999451,   4.74000549,  -3.25999451,   4.74000549,
         -11.25999451,   4.74000549,  -3.25999451,  -3.25999451,
          -3.25999451,   4.74000549, -11.25999451,  12.74000549],
        [  4.74000549,  -3.25999451,  -3.25999451,  12.74000549,
          -3.25999451, -11.25999451, -11.25999451,  -3.25999451,
           4.74000549,  -3.25999451, -19.25999451,   4.74000549],
        [ 20.74000549,  36.74000549,  20.74000549,  12.74000549,
          20.74000549,  12.74000549,  12.74000549,  36.74000549,
          12.74000549,   4.74000549,  20.74000549,  12.74000549],
        [ 36.74000549,  -3.25999451,   4.74000549,  -3.25999451,
           4.74000549,  28.74000549,  12.74000549,   4.74000549,
          12.74000549,  36.74000549,  28.74000549,  20.74000549],
        [  4.74000549,   4.74000549,   4.74000549,   4.74000549,
           4.74000549,   4.74000549,   4.74000549,   4.74000549,
           4.74000549,   4.74000549,   4.74000549,   4.74000549]],

       [[         nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan],
        [         nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan],
        [         nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan],
        [         nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan],
        [         nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan],
        [         nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan],
        [         nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan,
                  nan,          nan,          nan,          nan]]])
[ ]: