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 |