Polytope time series

In this notebook you will see how to:

  • use Polytope to retrieve a timeseries at a specific location of interest

  • aggregate the data over the ensemble and create a simple timeseries plot

  • create a meteogram

Components of earthkit

This tutorial uses the following earthkit components - click any logo to open the package documentation:

earthkit-data earthkit-transforms earthkit-plots

1. Data retrieval

First, retrieve ENS time series data using Polytope.

[ ]:
import earthkit.data as ekd

# lat, lon
location = [38.78655345978706, -9.109280931080349]

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

ds = ekd.from_source("polytope", "ecmwf-mars", request, stream=False, address='polytope.ecmwf.int').to_xarray()
ds
<xarray.Dataset> Size: 176kB
Dimensions:    (latitude: 1, longitude: 1, levelist: 1, number: 50,
                datetime: 1, t: 145)
Coordinates:
  * latitude   (latitude) float64 8B 38.77
  * longitude  (longitude) float64 8B 350.9
  * 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 '2026-04-14T00:00:00Z'
  * t          (t) datetime64[ns] 1kB 2026-04-14 ... 2026-04-29
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:  2026-04-14T00:00:00Z
    domain:         g
    expver:         0001
    levtype:        sfc
    number:         1
    stream:         enfo
    type:           pf
    levelist:       0

2. Aggregate and plot a simple timeseries

We can compute simple aggregations easily using earthkit-transforms.

[ ]:
import earthkit.transforms as ekt
import earthkit.plots as ekp

mean_ds = ekt.ensemble.mean(ds)

ekp.timeseries.line(
    mean_ds['2t'],
    x="t",
    x_units="celsius",
    title="ERA5 hourly {variable_name} at {latitude:%Lt} {longitude:%Ln}"
).show()
../_images/tutorials_polytope_timeseries_5_0.png

3. Plot a meteogram directly

More powerful plots are quickly available with earthkit-plots. We can directly plot the retrieved data as an ENS meteogram.

[ ]:
TIME_FREQUENCY = "6h"
QUANTILES = [0, 0.1, 0.25, 0.5, 0.75, 0.9, 1]

ekp.timeseries.multiboxplot(ds, resample=TIME_FREQUENCY, quantiles=QUANTILES).line(
    ds.mean(dim="number")
)
../_images/tutorials_polytope_timeseries_7_0.png