CoverageJSON: retrieving time series with Polytope

The polytope source provides access to the Polytope web services.

The following example retrieves time series for an ENS forecast for some surface parameters using polytope.

[1]:
import earthkit.data as ekd

location = [46.5, 17]  # lat, lon

request = {
    "class": "od",
    "stream": "enfo",
    "type": "pf",
    "expver": 1,
    "domain": "g",
    "date": -1,
    "time": 0,
    "levtype": "sfc",
    "param": [164, 167, 169],
    "number": "1/to/50",
    "feature": {
        "type": "timeseries",
        "points": [location],
        "axes": "step",
        "range": {
            "start": 0,
            "end": 360,
        },
    },
    "format": "covjson",
}

ds = ekd.from_source("polytope", "ecmwf-mars", request=request, stream=False, address="polytope.ecmwf.int")

The data is retrieved as CoverageJSON, which we can convert to Xarray for further processing (the conversion uses the covjsonkit package under the hood).

[2]:
ds.to_xarray()
[2]:
<xarray.Dataset> Size: 176kB
Dimensions:    (latitude: 1, longitude: 1, levelist: 1, number: 50,
                datetime: 1, t: 145)
Coordinates:
  * latitude   (latitude) float64 8B 46.5
  * longitude  (longitude) float64 8B 17.05
  * levelist   (levelist) int64 8B 0
  * number     (number) int64 400B 1 2 3 4 5 6 7 8 9 ... 43 44 45 46 47 48 49 50
  * datetime   (datetime) <U20 80B '2025-10-21T00:00:00Z'
  * t          (t) datetime64[ns] 1kB 2025-10-21 ... 2025-11-05
Data variables:
    tcc        (latitude, longitude, levelist, number, datetime, t) float64 58kB ...
    2t         (latitude, longitude, levelist, number, datetime, t) float64 58kB ...
    ssrd       (latitude, longitude, levelist, number, datetime, t) float64 58kB ...
Attributes:
    class:          od
    Forecast date:  2025-10-21T00:00:00Z
    domain:         g
    expver:         0001
    levtype:        sfc
    number:         1
    stream:         enfo
    type:           pf