https://img.shields.io/pypi/v/earthkit-data-meteoswiss-opendata.svg Documentation https://img.shields.io/pypi/pyversions/earthkit-data-meteoswiss-opendata.svg https://img.shields.io/pypi/l/earthkit-data-meteoswiss-opendata.svg https://github.com/MeteoSwiss/earthkit-data-meteoswiss-opendata/actions/workflows/CI_test.yaml/badge.svg https://github.com/MeteoSwiss/earthkit-data-meteoswiss-opendata/actions/workflows/CI_publish_dev_documentation.yaml/badge.svg

Getting Started#

earthkit-data-meteoswiss-opendata provides earthkit-data source plugins for accessing MeteoSwiss numerical weather prediction data through the MeteoSwiss Open Data STAC API.

Installation#

Install the released package with pip:

$ pip install earthkit-data-meteoswiss-opendata

With Poetry:

$ poetry add earthkit-data-meteoswiss-opendata

Installing the package also installs earthkit-data and automatically registers the meteoswiss-opendata and meteoswiss-opendata-constants source plugins. No additional plugin configuration is required.

Using the Library#

Load the latest deterministic ICON-CH2-EPS forecast +0h, +1h & +2h for total precipitation:

import datetime as dt

import earthkit.data as ekd

forecast = ekd.from_source(
    "meteoswiss-opendata",
    collection="ogd-forecasting-icon-ch2",
    variable="TOT_PREC",
    perturbed=False,
    ref_time="latest",
    lead_time=[
        dt.timedelta(hours=0),
        dt.timedelta(hours=1),
        dt.timedelta(hours=2),
    ],
)

dataset = forecast.to_xarray(time_dims=["forecast_reference_time", "step"], squeeze=False)
print(dataset)

For ref_time="latest", the plugin selects the newest forecast run that contains all requested lead times. An exact reference time can be provided as a timezone-aware datetime.datetime:

forecast = ekd.from_source(
    "meteoswiss-opendata",
    collection="ogd-forecasting-icon-ch2",
    variable="TOT_PREC",
    perturbed=False,
    ref_time=dt.datetime(
        2026,
        7,
        20,
        6,
        tzinfo=dt.timezone.utc,
    ),
    lead_time=dt.timedelta(hours=1),
)

ISO 8601 strings such as "2026-07-20T06:00:00Z" and "PT1H" are also accepted.

Parameters#

collection

MeteoSwiss Open Data collection, for example ogd-forecasting-icon-ch2.

variable

Forecast variable name, for example TOT_PREC.

perturbed

False for deterministic data or True for perturbed data.

ref_time

"latest", a timezone-aware datetime.datetime, an ISO 8601 datetime string, or an ISO 8601 datetime interval.

lead_time

A datetime.timedelta, an ISO 8601 duration string, or a list of either. Examples include datetime.timedelta(hours=1), "PT1H", and ["PT0H", "PT1H", "PT2H"].

Model Constants#

Load the horizontal or vertical constants associated with a model collection:

horizontal = ekd.from_source(
    "meteoswiss-opendata-constants",
    collection="ogd-forecasting-icon-ch2",
    asset="horizontal",
)

vertical = ekd.from_source(
    "meteoswiss-opendata-constants",
    collection="ogd-forecasting-icon-ch2",
    asset="vertical",
)

The asset parameter accepts "horizontal" or "vertical". The returned data can be handled with the standard earthkit methods e.g. to_xarray() or to_target(), for example:

horizontal.to_target(
    "file",
    "horizontal_constants_icon-ch2-eps.grib2",
)

Development Setup with Poetry#

Building the Project#

$ cd earthkit-data-meteoswiss-opendata
$ poetry install

Run Tests#

Run the offline unit tests:

$ poetry run pytest

Run the optional live integration test:

$ RUN_INTEGRATION=1 poetry run pytest -m integration

Run Quality Tools#

$ poetry run pylint earthkit_data_meteoswiss_opendata
$ poetry run mypy earthkit_data_meteoswiss_opendata
$ poetry run ruff format --check
$ poetry run ruff check

Generate Documentation#

$ poetry run sphinx-build doc doc/_build

Then open doc/_build/index.html.

Build Wheels#

$ poetry build

Release the Project#

The project follows the GitOps concept: releases are triggered whenever a Git tag is created.

The tag must follow Semantic Versioning and PEP 440. Otherwise, the release task will fail.

Follow these steps to create a release:

  • Update CHANGELOG.rst with the release information.

  • Update doc/_static/switcher_config.json with the new documentation URL.

  • Create a new release and matching tag in the GitHub project.