How to use vertical interpolation for fieldlists with multiple dates?ΒΆ

The vertical interpolation for fieldlists only works for one set of unique levels. If your data contains the same set of levels for multiple dates/ensemble members etc. you need to process it in a loop.

We use GRIB data containing the same pressure levels for 4 different base datetimes.

[1]:
import earthkit.data as ekd

from earthkit.meteo.vertical import fieldlist as vertical

# get GRIB fieldlist
fl = ekd.from_source("sample", "era5_tquv_pl_subarea.grib").to_fieldlist()

t = fl.sel({"parameter.variable": "t"}).order_by("time.base_datetime")
t.ls()
[1]:
parameter.variable time.valid_datetime time.base_datetime time.step vertical.level vertical.level_type ensemble.member geography.grid_type
0 t 2016-09-26 00:00:00 2016-09-26 00:00:00 0 days 700 pressure 0 regular_ll
1 t 2016-09-26 00:00:00 2016-09-26 00:00:00 0 days 850 pressure 0 regular_ll
2 t 2016-09-26 00:00:00 2016-09-26 00:00:00 0 days 925 pressure 0 regular_ll
3 t 2016-09-26 06:00:00 2016-09-26 06:00:00 0 days 700 pressure 0 regular_ll
4 t 2016-09-26 06:00:00 2016-09-26 06:00:00 0 days 850 pressure 0 regular_ll
5 t 2016-09-26 06:00:00 2016-09-26 06:00:00 0 days 925 pressure 0 regular_ll
6 t 2016-09-26 12:00:00 2016-09-26 12:00:00 0 days 700 pressure 0 regular_ll
7 t 2016-09-26 12:00:00 2016-09-26 12:00:00 0 days 850 pressure 0 regular_ll
8 t 2016-09-26 12:00:00 2016-09-26 12:00:00 0 days 925 pressure 0 regular_ll
9 t 2016-09-26 18:00:00 2016-09-26 18:00:00 0 days 700 pressure 0 regular_ll
10 t 2016-09-26 18:00:00 2016-09-26 18:00:00 0 days 850 pressure 0 regular_ll
11 t 2016-09-26 18:00:00 2016-09-26 18:00:00 0 days 925 pressure 0 regular_ll
[2]:
# extract the unique dates
dates = t.unique("time.base_datetime")
dates
[2]:
{'time.base_datetime': (datetime.datetime(2016, 9, 26, 0, 0),
  datetime.datetime(2016, 9, 26, 6, 0),
  datetime.datetime(2016, 9, 26, 12, 0),
  datetime.datetime(2016, 9, 26, 18, 0))}
[3]:
# create empty fieldlist
t_res = ekd.create_fieldlist()

# interpolate in a loop
for d in dates["time.base_datetime"]:
    t_d = t.sel({"time.base_datetime": d})
    coords = [f.vertical.level(units="Pa") for f in t_d]  # Pa coord
    target_coords = [90000, 80000]  # Pa

    # we can only pass one set of unique levels for this method
    r = vertical.interpolate_monotonic(t_d, coords=coords, target_coords=target_coords, coord_type="pressure")

    t_res = ekd.concat(t_res, r)

t_res.ls()
[3]:
parameter.variable time.valid_datetime time.base_datetime time.step vertical.level vertical.level_type ensemble.member geography.grid_type
0 t 2016-09-26 00:00:00 2016-09-26 00:00:00 0 days 900.0 pressure 0 regular_ll
1 t 2016-09-26 00:00:00 2016-09-26 00:00:00 0 days 800.0 pressure 0 regular_ll
2 t 2016-09-26 06:00:00 2016-09-26 06:00:00 0 days 900.0 pressure 0 regular_ll
3 t 2016-09-26 06:00:00 2016-09-26 06:00:00 0 days 800.0 pressure 0 regular_ll
4 t 2016-09-26 12:00:00 2016-09-26 12:00:00 0 days 900.0 pressure 0 regular_ll
5 t 2016-09-26 12:00:00 2016-09-26 12:00:00 0 days 800.0 pressure 0 regular_ll
6 t 2016-09-26 18:00:00 2016-09-26 18:00:00 0 days 900.0 pressure 0 regular_ll
7 t 2016-09-26 18:00:00 2016-09-26 18:00:00 0 days 800.0 pressure 0 regular_ll
[ ]: