Skip to main content

dwdopen

Python library to download numerical weather prediction (NWP) data from DWD Open Data. List currently available models, parameters, and runs. Select what data you want and download it as GRIB2 file(s).

Install

Requires Python 3.11 or newer.

pip install dwdopen

Quickstart

from dwdopen import DWD, Every

with DWD() as dwd:
    icon_eu = dwd.nwp.model("icon-eu")
    query = icon_eu.select(["T_2M", "TOT_PREC"], steps=Every("0h", "24h", "3h"))
    query.download("forecast.grib2")

This downloads 2 m temperature and total precipitation for the next 24 hours, every 3 hours, from the newest ICON-EU run that is completely published, into one GRIB2 file.

Discovery

dwd.nwp.models()                    # ['aicon', 'icon', 'icon-art', ..., 'icon-eu-eps']
icon_eu.parameters()                # ['ALB_RAD', 'ALHFL_S', ..., 'T_2M', ...]
icon_eu.parameter("T")              # on pressure (100) and model (150) levels
icon_eu.levels("T", "pressure")     # [50, 70, 100, ..., 850, ..., 1000]  (hPa)
icon_eu.runs()                      # [..., Run(2026-10-27T06:00Z)], oldest first

Examples

These continue inside the with DWD() as dwd: block of the quickstart.

Upper air: temperature on 850 and 500 hPa at +12 h.

upper_air = icon_eu.select("T", level_type="pressure", levels=[850, 500], steps=["12h"])
upper_air.download("t.grib2")

Ensemble: the first 5 members of ICON-EU-EPS, one file per member, into a directory.

from dwdopen import Between

eps = dwd.nwp.model("icon-eu-eps")
ensemble = eps.select("T_2M", members=Between(1, 5), steps="24h")
ensemble.download("members/", combine="member")

A scheduled job: give a directory instead of a file name, and the file is named after the model, run and selection. Running the job again for the same run downloads nothing. query is the one from the quickstart.

result = query.download("/data/icon-eu/")
# /data/icon-eu/icon-eu_2026-10-27T0600_TOT_PREC+T_2M_single_0h-24h_ec484355.grib2
result.assets_skipped   # 18 on the second run: the file was already there

Look before you download: resolve() freezes a query against one run and gives you a plan to inspect. The plan never switches to a newer run later.

plan = query.resolve()
print(plan)
# ResolvedRequest(run=2026-10-27T06:00Z, 18 assets, 12.1 MB, TOT_PREC, T_2M,
#                 9 steps 0h..24h)
plan.download("forecast.grib2")

The data is on the native ICON grid

DWD publishes every model on the unstructured triangular ICON grid. To get a regular lat-lon grid, regrid with CDO. For ICON global, DWD provides ready-made weights:

# from https://opendata.dwd.de/weather/lib/cdo/ICON_GLOBAL2WORLD_025_EASY.tar.bz2
cdo -f nc remap,target_grid_world_025.txt,weights_icogl2world_025.nc t_2m.grib2 t_2m.nc

For ICON-EU and the other models see Regridding in the guide.

Features

The guide explains each of these in detail.

  • Every ICON model on DWD Open Data: ICON, ICON-EU, ICON-D2, ICON-D2-RUC, their ensembles, ICON-ART and AICON. Nothing is hard-coded.
  • Steps as durations: "6h", ["0h", "3h"], Every("0h", "48h", "3h"), Between("0h", "48h"), "all", and 15 or 5 minute steps for ICON-D2 and ICON-D2-RUC.
  • Vertical levels: pressure levels in hPa, model levels and soil levels.
  • Ensemble members: members=[1, 2, 5], Between(1, 10), or all of them.
  • ICON-ART wavelengths: wavelengths=532 for the dust backscatter fields.
  • Complete runs only: by default a run that DWD is still publishing is skipped, and require="partial" takes what is there and reports the rest.
  • Combining: return one file, one per parameter, one per ensemble member, or one file per GRIB message.
  • Safe, resumable downloads: concurrent, written atomically, already downloaded files are skipped, with a progress bar.
  • Clear errors: every error is a DWDOpenError, and typos in names and options are caught before anything is downloaded.

Roadmap

After 1.0

  • A command-line interface.

Long term

The goal is a complete Python interface to DWD Open Data:

  • Observations and current station reports (weather/weather_reports).
  • Radar: composites and single-site products (weather/radar).
  • Point forecasts: MOSMIX (weather/local_forecasts).
  • Weather warnings (weather/alerts).
  • Satellite products (weather/satellite).

License

MIT. See LICENSE.

Forecast data itself is provided by Deutscher Wetterdienst (DWD) under its own terms of use.

Metadata

Release files for dwdopen 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dwdopen 1.0.0
File Size Uploaded Provenance Actions
dwdopen-1.0.0.tar.gz 79.7 kB With provenance Details for dwdopen-1.0.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for dwdopen 1.0.0
File Interpreter ABI Platform Actions
dwdopen-1.0.0-py3-none-any.whl Python 3 none any Details for dwdopen-1.0.0-py3-none-any.whl

Total release size: 132.9 kB

Release files / dwdopen-1.0.0.tar.gz

Download URL dwdopen-1.0.0.tar.gz
Size 79.7 kB
Tags Source
SHA-256 checksum
How to use checksums
931652691bace3445ba2adb7c95698283adfa226e1445ea46576c8fc57c8c878
BLAKE2b-256 checksum
How to use checksums
acbf21263ece2712b41fd8849b65aaaa949057c5ca3e529f306c14a67d264b64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

Release files / dwdopen-1.0.0-py3-none-any.whl

Download URL dwdopen-1.0.0-py3-none-any.whl
Size 53.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d2e9f22ca584cf5bc286a60cd933d0f41c48333c1890c9e086e5d6946a8804f8
BLAKE2b-256 checksum
How to use checksums
afa93a2c90ec46c0d7ad94c19c2acd6b9bb87ca38a55fedc0339e85612abf721
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

Security for dwdopen 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for dwdopen-1.0.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page