list-of-dicts: overview

The list-of-dicts source reads data from a list of dictionaries. Each dictionary represents a single field and the result is a FieldList consisting of ArrayField fields.

First, we create the input data using generic metadata keys. The latitudes and longitudes specified as disctinct values, the 2D field geometry will be automatically built from them.

[1]:
import earthkit.data as ekd

prototype = {
        "latitudes": [10.0, 0.0, -10.0],
        "longitudes": [20, 40.0],
        "values": [1, 2, 3, 4, 5, 6],
        "valid_datetime": "2018-08-01T09:00:00Z",
    }

d = [
        {"param": "t", "level": 500, **prototype},
        {"param": "t", "level": 850, **prototype},
        {"param": "u", "level": 500, **prototype},
        {"param": "u", "level": 850, **prototype},
        {"param": "d", "level": 850, **prototype},
        {"param": "d", "level": 600, **prototype},
    ]

Next, load the data into fieldlist as a list-of-dicts source using from_source().

[2]:
ds = ekd.from_source("list-of-dicts", d)
[3]:
ds.ls()
[3]:
param level base_datetime valid_datetime step number
0 t 500 None 2018-08-01T09:00:00+00:00 None None
1 t 850 None 2018-08-01T09:00:00+00:00 None None
2 u 500 None 2018-08-01T09:00:00+00:00 None None
3 u 850 None 2018-08-01T09:00:00+00:00 None None
4 d 850 None 2018-08-01T09:00:00+00:00 None None
5 d 600 None 2018-08-01T09:00:00+00:00 None None
[4]:
ds[0].to_latlon()
[4]:
{'lat': array([[ 10.,  10.],
        [  0.,   0.],
        [-10., -10.]]),
 'lon': array([[20., 40.],
        [20., 40.],
        [20., 40.]])}
[5]:
ds[0].grid_points()
[5]:
(array([ 10.,  10.,   0.,   0., -10., -10.]),
 array([20., 40., 20., 40., 20., 40.]))
[6]:
ds.to_numpy()
[6]:
array([[[1, 2],
        [3, 4],
        [5, 6]],

       [[1, 2],
        [3, 4],
        [5, 6]],

       [[1, 2],
        [3, 4],
        [5, 6]],

       [[1, 2],
        [3, 4],
        [5, 6]],

       [[1, 2],
        [3, 4],
        [5, 6]],

       [[1, 2],
        [3, 4],
        [5, 6]]])
[7]:
ds.metadata("level")
[7]:
[500, 850, 500, 850, 850, 600]
[8]:
ds[0].metadata().datetime()
[8]:
{'base_time': None,
 'valid_time': datetime.datetime(2018, 8, 1, 9, 0, tzinfo=tzutc())}
[9]:
ds[0].metadata().valid_datetime()
[9]:
datetime.datetime(2018, 8, 1, 9, 0, tzinfo=tzutc())
[10]:
ds.sel(param="t").ls()
[10]:
param level base_datetime valid_datetime step number
0 t 500 None 2018-08-01T09:00:00+00:00 None None
1 t 850 None 2018-08-01T09:00:00+00:00 None None
[11]:
ds.order_by("level").ls()
[11]:
param level base_datetime valid_datetime step number
0 t 500 None 2018-08-01T09:00:00+00:00 None None
1 u 500 None 2018-08-01T09:00:00+00:00 None None
2 d 600 None 2018-08-01T09:00:00+00:00 None None
3 t 850 None 2018-08-01T09:00:00+00:00 None None
4 u 850 None 2018-08-01T09:00:00+00:00 None None
5 d 850 None 2018-08-01T09:00:00+00:00 None None