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: ECMWFThe 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]]])
[ ]: