Changelog

Contents

Changelog#

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Types of changes:

  • Added for new features.

  • Changed for changes in existing functionality.

  • Deprecated for soon-to-be removed features.

  • Removed for now removed features.

  • Fixed for any bug fixes.

  • Security in case of vulnerabilities.

Unreleased#

Added#

  • CI: new Minimum dependency versions job that resolves every direct dependency to the lowest version its specifier allows (UV_RESOLUTION=lowest-direct) and runs the test suite against it, so that declared floors are actually exercised

  • Canonical parameter table (wetterdienst.metadata.parameter_table) holding the unit_type of each of the 504 canonical parameter names in one place, plus a test that checks every provider declaration against it — that the name is canonical and that the declared unit is a unit of that quantity. The table is now the single source of unit_type; see below

  • New canonical parameters radiation_global_intensity, radiation_sky_long_wave_intensity and radiation_sky_short_wave_diffuse_intensity for sources that report irradiance (power per area) rather than irradiation accumulated over the interval (energy per area)

  • Docs: a parameter glossary on the Parameters page, built from the canonical parameter table at build time by the local Sphinx extension docs/_ext/parameter_glossary.py. Every parameter in every provider’s metadata table now links to its glossary entry

  • wetterdienst.metadata.unit_type.UnitType, a literal of the 23 unit types the unit converter knows. CanonicalParameter.unit_type is typed with it, so a mistyped unit type in the parameter table is a type error rather than something only a test can catch. A test pins the literal to UnitConverter in both directions, since the converter builds its unit types as a runtime dict that no static type can be derived from

  • Parameter discovery across all three interfaces: GET /api/glossary, the glossary MCP tool and wetterdienst about glossary. coverage answers which parameters a given provider offers; the glossary answers what any of them measures and which unit it comes back in — neither of which coverage reports. Filter with parameter= (substring match over the 504 names), unit_type= (a closed vocabulary, so an unknown one is a 422 or a CLI usage error rather than an empty result) and limit= to cap the response. The unit reported is the one a values request would actually return, including any ts_unit_targets override. This is what puts the canonical descriptions in front of users rather than only in the docs. A filter matching nothing is an empty list over HTTP and a non-zero exit on the CLI, the latter following grep so a shell script can tell

  • A one-sentence description for all 504 canonical parameters, so the glossary now says what each quantity is rather than only which unit it comes back in — that soil temperatures are at a stated depth under a stated cover, that wind_movement_24h is wind run, that radiation_global is accumulated energy while radiation_global_intensity is power. They are deliberately provider- and resolution-independent, describing the quantity rather than one source’s version of it. They appear in the docs glossary today; exposing them through the REST API, CLI and MCP is a separate change, since discover() reports name, unit type and unit only

Changed#

  • The Parameter enum is no longer used inside the library. The three places that hard-coded parameter names — TimeseriesRequest.interpolatable_parameters, interpolation’s occurrence-based set and the ts_geo_station_distance defaults — used it purely to spell a lowercased string, and now spell the canonical name directly. All 186 references resolve to the same 126/30/30 names as before. test_internal_parameter_lists_are_canonical replaces the typo-safety the enum was providing, since a misspelled string would otherwise quietly mean “never interpolated” or “keeps the default search radius” rather than failing

  • Breaking: irradiance (power_per_area) is now returned in W/m² rather than W/cm², so affected values are 10⁴ times larger. W/m² is what WMO specifies and what every source in this library actually publishes — MeteoSwiss global radiation now reads 0–1344 W/m² where it used to read 0–0.1344 W/cm². Affects the 17 declarations using power_per_area: KNMI (10 minutes), MeteoSwiss, met.no Frost and RMI. Set ts_unit_targets={"power_per_area": "watt_per_square_centimeter"} to keep the old output. Irradiation (energy_per_area) is unchanged and still returned in J/cm², which is the conventional unit for it

  • Breaking: KNMI (10 minutes), RMI, MeteoSwiss and met.no reported irradiance in W/m² under the radiation_global, radiation_sky_long_wave and radiation_sky_short_wave_diffuse names, which elsewhere mean irradiation in J/cm². These declarations moved to the new radiation_*_intensity names. KNMI is the clearest case: its 10-minute qg is W/m² while its hourly and daily Q is J/cm², so one name was covering two quantities that no unit conversion relates without the accumulation interval. Queries using the old names against these providers need to switch to the _intensity names; DWD and every other provider are unaffected

  • Breaking: Geosphere 10-minute and hourly radiation is now returned as published rather than silently rescaled. cglo and chim are irradiance in W/m², but the parser multiplied them by the interval length (600/10000 and 3600/10000) to present them as irradiation in J/cm² under the radiation_global and radiation_sky_short_wave_diffuse names. That conversion is removed and the three declarations moved to radiation_global_intensity and radiation_sky_short_wave_diffuse_intensity in W/m². Values are correspondingly 16.67× (10 minutes) and 2.78× (hourly) larger; multiply by 0.06 and 0.36 respectively to recover the old numbers. Daily and monthly are unaffected — they use cglo_j, a distinct upstream parameter genuinely accumulated over the interval, and keep radiation_global in J/cm². This was the only in-parser unit conversion left in the library

  • Breaking: Météo-France synop visibility_range was the only declaration of that parameter using length_long, so it was returned in km while all 15 other declarations return m. It now uses length_medium and returns m

  • Docs: provider metadata tables no longer repeat the unit type column. The unit type is a property of the canonical parameter, so it is stated once in the glossary; the unit column stays, because that really is the individual provider’s own

  • Fixed nine provider docs rows that named parameters renamed in the code but not in the docs (*_indicator*_index for DWD, pressure_air_slpressure_air_sea_level for Geosphere/NWS, pressure_air_shpressure_air_site for NWS, flowdischarge for Eaufrance)

  • Fixed tests/test_docs.py::test_data_coverage, which had been passing without checking anything because its provider path pointed at <root>/wetterdienst/provider instead of <root>/src/...

Fixed#

  • The three new radiation_*_intensity parameters are now listed in TimeseriesRequest.interpolatable_parameters. Without them, interpolate() and summarize() silently dropped the renamed radiation parameters for the affected providers

  • Fixed four more provider docs rows that named parameters renamed in the code but not in the docs: DWD 1-minute and 5-minute precipitation_formprecipitation_index, and the unit cell of DWD DMO hourly visibility_range, which repeated the unit type instead of naming the unit

  • Raise several dependency floors that were declared lower than what the code actually needs: aiohttp>=3.14.0 (encode_basic_auth), stamina>=25.1.0 (set_testing as a context manager), pandas>=2.2.2, shapely>=2.0.4 and h5py>=3.11 (NumPy 2 support), plotly>=6.1.1 with kaleido>=1.0.0 (static image export), and click>=8.2 (separately captured stderr in CliRunner)

  • Raise the development tooling floors to the versions we develop against, so that the minimum versions job only exercises runtime dependency floors

Removed#

  • Breaking: the Parameter enum, exported from the package root. It listed the canonical parameter names but could not be used to request them — parameters= accepts strings, tuples, ParameterModel and DatasetModel, so passing a member raised AttributeError: 'Parameter' object has no attribute 'strip'. It appeared in no example and no documentation page, and its last internal uses are gone (see Changed). The canonical names live in wetterdienst.metadata.parameter_table, which also carries each parameter’s unit type and description, and are discoverable through the new glossary endpoint, MCP tool and wetterdienst about glossary. Callers who used it to spell a name should use the string directly

  • The unit_type key from provider metadata declarations — 1575 of them across 29 files. It is a property of the measured quantity rather than of the provider, and restating it once per declaration is what let the same canonical name pick different output units in different providers. ParameterModel.unit_type now reads it from the canonical parameter table via the parameter’s name, and ParameterModel rejects the key outright so an override cannot creep back in. All 1692 parameters resolve to exactly the same unit_type as before, so nothing changes for users of the library — but a third-party or custom provider metadata dict that still declares unit_type will now fail to validate, and should simply drop the key. discover() and the REST and CLI responses report unit_type exactly as before. It is no longer part of ParameterModel.model_dump()/model_dump_json(), since it is derived from the parameter’s name and emitting it per declaration would reintroduce at the serialization layer the duplication this removes; look the name up in wetterdienst.metadata.parameter_table instead

  • Breaking: five Parameter enum members that no provider declared, so no request could ever return them: HUMIDEX, PRECIPITATION_FREQUENCY, PRECIPITATION_HEIGHT_LIQUID_MAX, TIME_WIND_GUST_MAX and TIME_WIND_GUST_MAX_1MILE_OR_1MIN. The dead entries referencing two of them in the interpolation membership lists went with them

  • Docs: docs/data/provider/eccc/observation/annual.md. ECCC’s annual resolution was dropped when observation values moved to the api.weather.gc.ca OGC API, and the docs still described it, along with humidex under hourly. The ECCC observation overview also still described bulk CSV downloads and four resolutions; corrected

  • Docs: the pressure_air_sea row from IMGW meteorology daily, a parameter that provider no longer exposes

  • Unused jsonschema development dependency

0.132.0 - 2026-08-04#

Changed#

  • Bump the minimum supported polars version to >=1.43.0 (from >=1.15.0), required by the explode(empty_as_null=...) and concat(how="horizontal_extend") APIs used below

Fixed#

  • Resolve polars and pyarrow deprecation warnings surfaced in the test suite: pass explicit empty_as_null=True to all explode() calls, switch concat(how="horizontal") to how="horizontal_extend", and read Feather exports via pyarrow.ipc.open_file() instead of the deprecated pyarrow.feather.read_table. Also vectorise two per-element map_elements calls (eaufrance/hubeau, ea/hydrology) that had native polars equivalents

  • Type the station response-model state field as nullable so the stations MCP tool stops rejecting MOSMIX/DMO stations. These forecast stations have no state and serialise state as null, but _Station.state and _OgcFeatureProperties.state were typed non-null, so the derived MCP output schema failed validation with Output validation error: None is not of type 'string' for every mosmix/dmo station listing (the same schema drift fixed for values/interpolate/summarize)

0.131.0 - 2026-08-02#

Added#

  • Add a DWD SWSMOS network (dwd/swsmos) exposing the road weather forecast (Straßenwetter-MOS) for DWD’s ~1800 road weather stations. Each model run provides an hourly forecast out to +167 hours (selectable via issue, default: the latest run): air, dew-point and road surface temperature, liquid precipitation, precipitation probabilities and the road surface condition. This is the forecast counterpart to the DWD road observation network

  • Add the DWD 10_minutes urban climate (Stadtklima) datasets to the dwd/observation network, served from DWD’s climate_urban/ path (recent period only): urban_precipitation, urban_pressure, urban_solar, urban_temperature_air (incl. the new temperature_radiant_mean_2m parameter), urban_temperature_extreme, urban_temperature_soil, urban_wind and urban_wind_extreme. These complement the existing hourly urban datasets. The urban station-description lists are parsed by content because they frequently leave the optional date and Bundesland fields blank

  • Add an IPMA (Portugal) observation provider (ipma/observation) backed by the key-less api.ipma.pt open-data JSON feeds. Provides near-real-time hourly observations (temperature, humidity, sea-level pressure, wind speed/direction, precipitation, global radiation) from ~222 stations. Recent-only (a rolling ~1-day window), so a date range within the last day is required. The -99.0 missing sentinel becomes null and the 8-point wind-direction code is converted to degrees

  • Add an LHMT (Lithuania) observation provider (lhmt/observation) backed by the key-less api.meteo.lt JSON REST API. Provides hourly observations (temperature, humidity, wind speed/gust/direction, cloud cover, sea-level pressure, precipitation, snow depth) from ~52 stations, with historical data back to roughly 2016 fetched per station and day. Settled past days are cached indefinitely while the current day uses a short cache

  • Add a Met Office (UK) observation provider (metoffice/observation) backed by the MIDAS Open archive on CEDA (UK Open Government Licence). Covers eight datasets across daily and hourly resolution (rain, temperature, weather, wind, radiation, soil temperature). Requires a free CEDA account (WD_AUTH__CEDA=<username>:<password>); the bearer token is minted from those credentials and cached in-process until shortly before it expires. Multiple report types per day are collapsed to one value per calendar day, multi-day rain accumulations are dropped, and native units are normalised (e.g. visibility from decametres to metres)

Changed#

  • Sharpen the interpolate/summarize endpoint descriptions (which become the MCP tool descriptions) and the MCP instructions so agents stop routing plain weather questions to them. stations -> values is now stated as the default for weather at a named place even when a specific past date is given, and interpolate/summarize are called out as opt-in estimates – used only on explicit request or when no station with data is near the point – because they add inaccuracy

Fixed#

  • Type the interpolate/summarize response-model items to match what the endpoints serialise, so their MCP output schemas stop rejecting valid results. _InterpolatedValuesItemDict and _SummarizedValuesItemDict now include the resolution/dataset keys (always present in the rows) and type value/distance_mean/distance/taken_station_id as nullable: interpolating or summarizing a point with no station in reach serialises null for those fields, which the previous non-null schema rejected (the same schema drift fixed for values in 0.130.0)

0.130.0 - 2026-07-30#

Changed#

  • Raise stale/incorrect dependency lower bounds to honest, still-compatible floors (no change to the resolved/tested versions). Most importantly fastapi>=0.115 (was >=0.95.1): the REST endpoints use Pydantic query-parameter models, a feature added in FastAPI 0.115, so the old floor advertised support the code never had. Also bump httpx>=0.27, uvicorn>=0.30, duckdb>=1 (restapi/sql/ duckdb extras), xarray>=2024.6, fsspec>=2024.6, python-dateutil>=2.8.2, tabulate>=0.9, tqdm>=4.64, click>=8.1, and add a lower bound to sqlalchemy-cratedb>=0.40 (was unbounded below). Dev/docs groups are unchanged

  • Rewrite the history, summarize and interpolate endpoint descriptions (which become the MCP tool descriptions) so small models stop mis-routing plain weather questions to them: they now say what each returns and that it is not measured weather – history is station metadata history (name/location/sensor changes), summarize/interpolate estimate a value for a point between stations. Add a “Choosing a tool” note to the MCP instructions pointing weather questions at the stations -> values workflow

Fixed#

  • Match station names with WRatio (was token_sort_ratio) in filter_by_name, so a bare place name finds its stations: name="Kiel" now returns Kiel-Holtenau/Kiel-Kronshagen instead of nothing (token_sort_ratio scored the length gap “Kiel” vs “Kiel-Holtenau” at ~47%, below the 0.8 threshold). WRatio is a partial matcher, so a query that is a common sub-token (e.g. name="Bad") matches many stations – set name_threshold=1.0 (keep only score-100 matches) or use the sql filter (sql="name = 'Aach'") for an exact name match

  • Honor the rank argument in filter_by_name (it was silently ignored, always returning up to 5 matches): it now returns the rank best matches, best score first (default 1). The stations REST/CLI listing requests several name candidates by default and passes through an explicit rank

  • Limit the stations listing to the requested rank on the REST API (/api/stations) and CLI (stations). A rank filter keeps every station in the frame (the rank limit is applied lazily during value collection), so a listing that asked for the N closest returned all stations instead – e.g. rank=3 near Kiel returned all 1284 DWD stations (a ~365 KB response that overwhelmed MCP clients). Listings now return the rank closest by distance

  • Return 404 for the OAuth discovery paths (/.well-known/oauth-authorization-server, /.well-known/oauth-protected-resource) on the REST API so MCP clients treat the open /mcp server as no-auth instead of attempting (and failing) OAuth Dynamic Client Registration

  • Type value/quality as float | None (was str) in the _ValuesItemDict response model, so the /api/values OpenAPI schema matches the numbers actually serialised. The MCP values tool derives its output schema from that model, and the wrong str type made FastMCP reject valid results with 9.0 is not of type 'string'. This fixes the real schema instead of the previous workaround (validate_output=False), so MCP output validation is now enabled again

0.129.0 - 2026-07-27#

Added#

  • Add an optional Model Context Protocol (MCP) endpoint at /mcp on the REST API, exposing the data endpoints as MCP tools over the streamable-HTTP transport (via FastMCP). The tools are made agent-friendly (workflow instructions, clean tool names, hidden noise endpoints, permissive output validation) so even small models can drive them. Enable it with the mcp extra (pip install wetterdienst[mcp]), which is included in the Docker image

  • Add DWD weather alerts (CAP warnings) provider (dwd/alerts) with Python API, CLI alerts command and REST /api/alerts endpoint: all active warnings, one row per alert, with a GeoJSON MultiPolygon geometry, on community (Gemeinde) or district (Landkreis) granularity; a date selects a historical snapshot from DWD’s rolling ~48-hour window

  • Parse DWD radar site BUFR products (echo top, reflectivity) into a polars DataFrame on RadarResult.df, opt-in via the read_bufr setting (requires the eccodes and bufr extras)

  • Add RMI (Belgium) observation provider with 10-minute, hourly and daily resolution from the automatic weather station (AWS) network (no authentication required)

  • Add CHMI (Czechia) observation provider with 10-minute, hourly, daily, monthly and annual resolution (no authentication required)

  • Add FMI (Finland) observation provider with hourly and daily resolution (no authentication required)

Changed#

  • Add descriptions to every field of the REST request models (stations, values, interpolate, summarize, history, issues). They surface in the REST API’s OpenAPI schema (/docs) and in the generated MCP tool parameters, making both surfaces self-documenting.

  • REST API and CLI: the with_metadata and with_stations options now default to false on the stations, values, interpolate, summarize and history commands/endpoints, so output contains just the requested data by default. Pass with_metadata=true / with_stations=true (or --with_metadata=true / --with_stations=true) to include the provider-metadata and station blocks as before.

  • Reduce DWD MOSMIX/DMO KML parsing memory by streaming the zipped KML instead of decompressing it fully in memory (~6.5x lower peak RSS on MOSMIX-S)

  • Refresh locked dependencies to their latest compatible versions (polars 1.43.1, pyarrow 25, fastapi 0.140.7, uvicorn 0.51, and others). Update the dev toolchain (ruff 0.16, ty 0.0.64) and adopt their new checks: ignore CPY001 (no per-file copyright headers) and PLR0917 (too-many-positional-arguments, sibling of the already-ignored PLR0913), fix a log.exception() call outside an exception handler, wrap implicitly concatenated test URLs, and narrow the DWD-derived available-dates set so min()/max() no longer see datetime | None

Fixed#

  • Parse NOAA GHCN-hourly (GHCNh) timestamps from the provided ISO date column instead of reconstructing them from separate year/month/day/hour/minute fields

  • Fix the about fields CLI command, which crashed with a TypeError because it forwarded resolution as a separate argument to describe_fields()

  • Report coverage cleanly for metadata-less standalone networks (dwd/radar, dwd/alerts): about coverage and /api/coverage now return a clear message instead of crashing with an AttributeError / HTTP 500

0.128.0 - 2026-07-22#

Added#

  • Add KNMI (Netherlands) observation provider with 10-minute, hourly and daily resolution (requires a free KNMI Data Platform API key)

  • Add DMI (Denmark) climate data observation provider with hourly, daily, monthly and annual resolution (no authentication required)

  • Add AEMET (Spain) observation provider with hourly (real-time), daily, monthly and annual resolution

  • Add SMHI (Sweden) observation provider with 1-minute, hourly, daily and monthly resolution

  • Add Météo-France (France) synop network (subdaily, 3-hourly)

  • Add Météo-France (France) observation network (6-minute, hourly, daily, monthly)

  • Add MeteoSwiss (Switzerland) observation provider with 10-minute, hourly, daily, monthly and annual resolution

Changed#

  • Reduce the memory footprint of aggregated value results (.values.all()) by storing the station_id, resolution, dataset and parameter columns as polars Enum instead of String (roughly halves the size of tidy frames); note that the dtype of these columns is now Enum. To get plain String columns back (e.g. for .str operations or strict dtype checks), cast them via df.with_columns(pl.col(pl.Enum).cast(pl.String))

0.127.0 - 2026-07-07#

Added#

  • [REST API] The /api/coverage endpoint now reports a date_required flag per provider/network, true if any of its resolutions require a date range for value queries (e.g. MET Norway Frost). Lets frontends surface this before submitting a query rather than after the query fails.

Changed#

  • [MET Norway Frost] Value requests now fetch all parameters of a dataset/resolution in a single batched request (comma-separated elements=) instead of one request per parameter, cutting the number of HTTP requests by up to 11x for multi-parameter queries. Falls back to the previous per-parameter behavior (including historical time-series discovery) if the batched request itself returns a 404.

  • [IMGW] File listing now prunes IMGW’s per-period subfolders (named YYYY or YYYY_YYYY, encoding the exact date range they cover) to only those overlapping the requested date range, instead of recursively listing the entire directory tree on every request. Cuts the number of HTTP requests from ~33 (meteorology) / ~74 (hydrology) down to the 1-2 folders that actually matter for a given query.

Removed#

  • [IMGW] Removed the hardcoded lat/lon override for hydrology station 150190410, a workaround for a corrupted upstream CSV line from ~2024-02. The station’s data has been clean upstream for a while, so the override had become a no-op; keeping it around risked silently clobbering a legitimate future coordinate change for that station.

Fixed#

  • [IMGW] Station listing for both meteorology and hydrology no longer fails: the upstream station CSVs gained an extra “founding year” column and switched from a Windows codepage to UTF-8, which broke column parsing and produced mojibake names. Also fixed a station-list column-index bug (hydrology latitude/longitude were reading the wrong columns), a missing return_dtype on the lat/lon DMS-to-decimal conversion, and station rows no longer carrying a resolution/dataset tag, which made .values.all() fail outright.

  • [IMGW] Hydrology value downloads now honor WD_USE_CERTIFI/use_certifi, matching the station list fetch and the meteorology provider. Previously it was silently ignored for the actual data downloads.

  • [IMGW] Hydrology daily requests touching 2023 or later no longer crash with ValueError: month must be in 1..12. IMGW switched from twelve monthly zips per year to one consolidated yearly zip starting 2023, which broke the date-range parsing that assumed a codz_YYYY_MM.zip filename. Also handles the two different (and, for 2024, outright malformed) CSV export quirks IMGW has used for these consolidated files since, for both daily and monthly hydrology data: semicolon-separated unquoted rows in 2023, and in 2024 every row wrapped in a broken extra pair of quotes with doubled inner quotes.

  • [IMGW] Meteorology synop daily requests no longer crash with TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'. Unlike every other IMGW meteorology dataset, synop daily has always been archived one file per station per period (e.g. 2024_100_s.zip for the station whose id ends in 100) rather than one file per month across all stations, going back to at least the 1966-1970 archive — the URL selection logic never accounted for this, so synop daily was non-functional for any date range.

0.126.0 - 2026-07-07#

Fixed#

  • [REST API] Station listing no longer fails with StartDateEndDateError for providers with date_required datasets (e.g. MET Norway Frost hourly, 10-minute, 6-hour). The date requirement only applies to value fetching, not to listing available stations. Also fixed a TypeError when constructing requests for providers that declare multi-period datasets but do not accept a periods constructor argument.

0.125.0 - 2026-07-06#

Added#

  • [MET Norway Frost] Add new provider metno/frost for the Norwegian Meteorological Institute’s Frost API. Supports 10-minute, hourly, 6-hour, daily, monthly and annual resolutions with ~2200 stations across Norway. Authentication via free API key (WD_AUTH__METNO_FROST env var). Historical synoptic 6-hourly data is retrieved via an availableTimeSeries fallback that resolves the time-series-specific query parameters required by the Frost API.

  • [Settings] Load .env files automatically via env_file=".env" and support nested env vars via env_nested_delimiter="__" (e.g. WD_TS_UNIT_TARGETS__temperature=degree_fahrenheit).

  • [Metadata] Add auth: bool = False field to MetadataModel so providers requiring an API key can declare it. Defaults to False for all existing providers.

  • [API] Add is_configured() -> bool and is_valid() -> bool classmethods to TimeseriesRequest. is_configured checks whether credentials are present (cheap, offline); is_valid probes the API to confirm they actually work (should be cached by the implementation). Both default to True for providers that need no auth.

  • [REST API] GET /api/coverage (no parameters) now returns {provider: {network: {auth: bool, configured: bool, valid: bool}}} instead of {provider: [network]}, exposing per-network auth status to API consumers.

  • [REST API] Add GET /api/auth?provider=&network= endpoint that returns {provider, network, auth, configured, valid} for a specific provider/network, allowing clients to re-check credential validity without fetching all coverage. valid is always false when configured is false (probe cannot run without credentials).

0.124.0 - 2026-06-30#

Added#

  • [DWD MOSMIX / DMO] Add available_issues(station_id, settings) classmethod to DwdMosmixRequest and DwdDmoRequest that lists the model-run datetimes currently available on DWD’s OpenData server for a given station (MOSMIX_L single-station KMZ files and ICON single-station KMZ files respectively).

  • [CLI] Add wetterdienst issues --provider <p> --network <n> --station <id> command that prints available issue datetimes as a JSON array.

  • [REST API] Add GET /api/issues?provider=<p>&network=<n>&station=<id> endpoint returning {"issues": ["<UTC ISO datetime>", ...]}. Currently supported: provider=dwd, network=mosmix and provider=dwd, network=dmo.

Fixed#

  • [DWD MOSMIX / DMO] Fix issue (and DMO lead_time) parameters being silently ignored when calling the REST API or _get_stations_request directly. The guard used isinstance(api, DwdMosmixRequest) where api is the class itself (not an instance), so the condition was always False and DwdForecastDate.LATEST was used regardless of the caller’s intent. Changed to issubclass and added a None-guard so that omitting issue still falls through to the dataclass default (DwdForecastDate.LATEST).

  • [Frontend / Meteogram] Fix x-axis tick labels overlapping massively on narrow mobile screens. Tick interval is now chosen based on actual chart pixel width: a 7-day MOSMIX forecast on a ~360 px phone uses 24-hour ticks instead of 6-hour ones (28 → 7 labels). Day-name annotations above the chart also shorten to weekday-only (Mo) when a day occupies fewer than 44 px, preventing header collisions on long forecasts.

0.123.0 - 2026-06-18#

Fixed#

  • [DWD Observation] Skip periods where all file downloads fail (empty filenames_and_files) before passing to the parser, preventing a polars.exceptions.InvalidOperationError from pl.concat(..., how="align") caused by a schema-less LazyFrame being mixed with valid ones.

  • Reduce stamina retry attempts in download_file from 3 to 2 to limit worst-case wait time per file on persistent network failures.

  • Add a default aiohttp.ClientTimeout(total=30) to fsspec_client_kwargs in Settings so HTTP connections time out after 30 seconds instead of hanging indefinitely.

  • Wrap bare int timeouts in aiohttp.ClientTimeout inside HTTPFileSystem.__init__ so that aiohttp >= 3.9 (which rejects plain int timeouts) works correctly with fsspec_client_kwargs.

0.122.0 - 2026-06-07#

Fixed#

  • Fix download_file retry mechanism: the previous @stamina.retry decorator was broken (the on= predicate checked ClientResponse instead of an exception, and all errors were swallowed before stamina could see them). Replaced with stamina.retry_context wrapping the filesystem.cat_file call directly. Retries are now triggered on FileNotFoundError, FSTimeoutError, ClientConnectorError, ClientResponseError and ClientPayloadError; all exhausted errors are returned as File objects rather than propagated.

  • [DWD Dmo] Convert latitude and longitude from degrees and minutes to decimal degrees using convert_dm_to_dd.

  • Fix station history parsing and add tests

0.121.1 - 2026-05-26#

Fixed#

  • Propagate Settings.use_certifi through NetworkFilesystemManager.get and the download helpers (download_file, download_files, list_remote_files_fsspec) so that fsspec’s HTTP clients use the certifi certificate bundle when requested. This ensures provider code using these helpers respects the global use_certifi setting. Fixes #1669. Thanks to @KonstantinWaser for reporting the issue.

0.121.0 - 2026-05-09#

Added#

  • Interpolation / summarize: greatly expanded the set of interpolatable parameters beyond the original six. All continuous, spatially-correlated meteorological fields are now supported, organised into two distance classes:

    • ~40 km (homogeneous / large-scale): all temperature variants at 2 m and 0.05 m (mean, max, min, last-24 h, multiday, mean-of-extremes), dew point, wet-bulb, wind-chill, surface temperature, soil temperatures (0.02 m – 2 m depth), heating/cooling degree aggregates, all humidity variants (humidity, humidity_absolute, humidity_max, humidity_min, humidex), all wind-speed variants and gust-max variants, wind movement, Beaufort scale, all sunshine-duration variants, global / diffuse / direct / long-wave radiation, all pressure variants (site, sea-level, reduced, max, min, tendency, vapour), total / effective / time- windowed cloud cover, and evapotranspiration / evaporation fields.

    • ~20 km (heterogeneous / locally variable): all precipitation-height variants (including liquid, droplet, rocker, last-1 h … last-24 h, multiday, significant- weather, max), precipitation duration, new-snow depth and its multiday / max variants, and new-snow water-equivalent variants.

    • Fixes #1651 (sunshine_duration was silently dropped by both interpolate and summarize because it was absent from interpolatable_parameters).

  • Interpolation: occurrence-threshold zeroing (previously only applied to precipitation_height) is now applied to all zero-inflated accumulation parameters: every precipitation-height variant, precipitation duration, new-snow depth variants, and new-snow water-equivalent variants. This prevents spurious small positive values when the surrounding stations recorded no event.

  • Tests: five new unit tests for the occurrence-threshold logic in core/interpolate.py (test_occurrence_threshold_*) and two new remote integration tests (test_interpolation_sunshine_duration_daily, test_interpolation_snow_depth_new_daily).

  • CLI: --start-date / --end-date options added to the values, interpolate, and summarize commands as a user-friendly alternative to the --date ISO-8601 interval syntax. Passing only --start-date treats it as a single-point date; passing only --end-date likewise. --date and --start-date/--end-date are mutually exclusive and raise a UsageError when combined.

  • CLI: comprehensive help text added to all options across the values, stations, interpolate, and summarize commands, including --provider, --network, --parameters, --periods, all station-filtering options, --format, --target, --shape, --humanize, --convert_units, --unit_targets, --skip_empty, --skip_criteria, --skip_threshold, --drop_nulls, --with_metadata, --with_stations, --pretty, and --issue.

Fixed#

  • Station name filtering (filter_by_name, --name) was case-sensitive, causing lowercase queries like "darmstadt" to return no results. Fixed by adding processor=fuzz_utils.default_process to the rapidfuzz call.

  • NOAA GHCN hourly: adapted to upstream format changes — the station list CSV now contains non-integer values in the WMO_ID column (e.g. "open"), and the per-station PSV files renamed the station identifier column from Station_ID to STATION.

  • DWD observation requests no longer raise MetaFileNotFoundError when a period’s station description file is absent on the server (e.g. 10_minutes/precipitation/now). The missing period is skipped with a warning and remaining periods are still returned.

  • No internet connection no longer raises an error; instead, an empty result is returned. ClientConnectorError (TCP/DNS failures) is caught in download_file and stored as NoInternetError in the File object. All provider call sites return empty DataFrame/LazyFrame values accordingly. Fixes #1624.

  • NetworkFilesystemManager now uses threading.local() instead of a class-level dict so each thread in ThreadPoolExecutor-based parallel downloads gets its own WholeFileCacheFileSystem instance, eliminating a race condition in the in-memory metadata cache that caused TypeError: cannot unpack non-iterable bool object at fsspec/implementations/cached.py:716.

  • Reverted the directory-listing cache from shelved-cache + cachetools back to diskcache. shelved-cache wraps Python’s dbm/shelve, which is not safe for concurrent access; parallel pytest-xdist workers sharing the same cache directory caused _dbm.error cascades and cascading test failures. diskcache uses SQLite and is both thread- and process-safe.

  • FileDirCache mapping semantics corrected: __getitem__ now raises KeyError on a cache miss (previously returned None) and short-circuits when use_listings_cache is False; __contains__ uses a proper existence check so falsy cached values (e.g. an empty directory listing []) are no longer misreported as absent; __len__ delegates to the underlying cache directly instead of materialising all keys.

Security#

  • diskcache advisory GHSA-w8v5-vhqr-4h9v (CVE-2025-69872, pickle deserialization) acknowledged and suppressed in pysentry and dependency-review. Exploitation requires write access to the local user cache directory, which is not a realistic attack vector for this project.

  • lxml upgraded to 6.1.0, resolving GHSA-vfmq-68hx-4jfw (local file read via resolve_entities).

Changed#

  • Station name filtering now uses token_sort_ratio instead of token_set_ratio, making word-order variations (e.g. "Koeln Bonn""Köln/Bonn") match correctly. Zero regressions across all 1281 stations; 149 stations now resolve to their correct match when searched by exact name.

  • Default fuzzy-match threshold for filter_by_name lowered from 0.9 to 0.8, allowing single-character typos and common shorthands to match while maintaining 100% precision.

  • name_threshold is now exposed in the CLI (--name-threshold) for the stations and values commands, and wired through StationsRequest / ValuesRequest models so the REST API /api/stations and /api/values endpoints honour it automatically. All previously stale 0.9 defaults in stripes endpoints updated to 0.8.

0.120.0 - 2026-04-11#

Added#

  • Add DWD Derived data for hourly climate (duett), daily soil, and monthly soil datasets, including parameters for evapotranspiration, soil moisture, soil temperature, frost/thaw depth, radiation, sunshine duration, and heating/cooling degree days, thanks @mspils and @jb-at-bdr

Changed#

  • ECCC observation: migrate data retrieval from legacy CSV bulk download to the api.weather.gc.ca OGC API. Updates parameter metadata to match new column naming, rewrites wide-to-long pivoting to handle *_flag quality columns, and expands timezone mapping to include daylight saving variants.

Fixed#

  • DWD describe_fields: adapt to updated PDF location and format. Description PDFs moved from the period subdirectory (e.g. daily/kl/recent/) to the dataset directory (daily/kl/). The PDF content now uses a structured table format with column name and description on the same line. The German section header changed from Parameter to CSV Inhaltsbeschreibung.

0.119.0 - 2026-02-17#

Added#

  • New API endpoint for climate stripes data

Changed#

  • Improve interpolation and summary

  • DWD DMO: Remove unnecessary validation for minimum dataframe length in date extraction

  • Rename API endpoint /stripes/values to /stripes/image

  • Migrate from diskcache to cachetools and shelved-cache for caching functionality. The new implementation uses shelved_cache.PersistentCache wrapping cachetools.TTLCache for improved maintainability while preserving all existing functionality and API compatibility.

Fixed#

  • Update API endpoint for geosphere data retrieval

0.118.0 - 2026-02-01#

Added#

  • Implement station history retrieval; added API and request support to query historical station snapshots and lifecycle events (created, updated, decommissioned) by station id and dataset.

  • Add use_certifi setting to use certifi certificate bundle instead of system certificates for HTTPS connections. Default is False for backward compatibility. Can be enabled via Settings(use_certifi=True) or environment variable WD_USE_CERTIFI=true.

Changed#

  • Move code to src directory

  • Filter By Rank: Sort stations by distance and station id

  • Soften validation for numbers and integers in UI core request models

0.117.0 - 2026-01-03#

Added#

  • Restapi: Add /api/version endpoint to get current version of wetterdienst backend (used in frontend)

0.116.0 - 2025-12-09#

Changed#

  • Improve polars code, thanks @SeeBastion524

Fixed#

  • Allow concatenation of station data with varying columns, thanks @jb-at-bdr

  • Adjust data type of “name” column, thanks @jb-at-bdr

0.115.0 - 2025-11-24#

Added#

  • Add classifier for python 3.14

  • Add new data of DWD Derived, thanks @jb-at-bdr

Changed#

  • Update docker image to use python 3.14

Fixed#

  • Cast value in interpolate function to float

    @ninjeanne reported that wetterdienst lately quirks when running interpolation. This issue is related to one of the new polars versions > 1.33.1. A shorthand fix would be to cast the value coming from the scipy interpolate function to a float.

0.114.3 - 2025-11-07#

Fixed#

  • [DWD Obs] Fix encoding issue

0.114.2 - 2025-11-05#

Fixed#

  • [DWD DMO] Fix path for icon_eu and minor fixes

0.114.1 - 2025-11-01#

Fixed#

  • Fix global import of duckdb exception in to_target method

0.114.0 - 2025-10-31#

Added#

  • [DWD Obs] Use utf8 encoding for parsing data

  • Add if_exists argument to to_target

  • Use more polars-native methods

Fixed#

  • [DWD Road]: Skip empty files

Changed#

  • Bump polars minimum to 1.15.0

0.113.0 - 2025-09-21#

Added#

  • Make Mosmix and DMO a lot faster for multiple stations requests

Changed#

  • Bump pypdf to <7

  • Make pypdf optional

0.112.0 - 2025-09-06#

Changed#

  • Switch back to WholeFileCacheFileSystem for caching

  • Improve more things on caching

  • Update uv.lock

  • Polars: Set format and timezone on datetime conversion

0.111.0 - 2025-08-03#

Added#

  • Make humidity interpolatable

  • Improve interpolation configuration

  • Set missing return_dtype in fileindex function

  • Set return_dtype for polars functions

Changed#

  • Pin zarr to >=3.1;python_version>=3.11

  • Docker: Copy uv bin from uv image

  • Pin lxml to <7

Fixed#

  • Parse parameters only if any are given

  • Fix export for interpolated values to csv

  • Round timestamps of hourly solar data to nearest hour

  • Fix several polars issues

  • Docker: Install chromium to fix png export

0.110.0 - 2025-07-23#

Added#

  • Make retry of download_file more robust

  • Overhaul docs switching to sphinx and myst-parser

  • Improve exception handling in restapi

  • Improve download of files

Changed#

  • Drop upper version pins for fsspec and tzdata

  • Introduce wetterdienst.model, streamline others

  • Bump minimum kaleido version to 0.2.2

Fixed#

  • Export: Fix influx tags and fields

  • [NOAA GHCN hourly] Fix metadata creation

  • Include resolution column in wide format

  • Disallow polars==1.31.0 due to issues

0.109.0 - 2025-06-03#

Changed#

  • Split coordinates and bbox into separate arguments

  • Bump dependencies

0.108.0 - 2025-04-25#

Added#

  • Improve restapi look and add impressum

  • Add uvloop and httptools for speed via uvicorn[standard]

Changed#

  • Use dataclass everywhere

  • Refactor query method

  • Adjust retry of function download_file

Fixed#

  • Fix numerous radar tests

0.107.0 - 2025-03-25#

Changed#

  • Refactor download_file

Fixed#

  • Fix false attribute parsing by pydantic model in cli

  • Fix datetime parsing for generic radar data

0.106.0 - 2025-03-05#

Fixed#

  • Improve parameter unpacking in ParameterSearch.parse

  • Fix docker manifest

0.105.0 - 2025-03-01#

Added#

  • Add user agent to default fsspec_client_kwargs

  • Adjust apis to track resolution and dataset (allows querying data for different resolutions and datasets in one request)

Changed#

  • Improve date parsing across multiple apis

  • Cleanup docker image

  • Improve numerous apis

Fixed#

  • [WSV Pegel] Fix characteristic values and improve date parsing

0.104.0 - 2025-02-15#

Changed#

  • Reduce the margin of the stations plot

  • Make pydantic models for uis simpler

  • Migrate from sklearn+numpy to pyarrow for location querying

  • Remove command from Docker file

  • Improve workflow for Docker

  • Get rid of columns enumeration

  • [NOAA GHCN] Improve date parsing and other fixes

0.103.0 - 2025-02-02#

Added#

  • Stripes: Replace matplotlib by plotly

  • Explorer: Add download button for plot

  • Split up plotting extras into plotting and matplotlib

  • Interpolation/Summary: Add dataset to DataFrame

  • Add plotting capabilities

Changed#

  • Update docker image extras

Removed#

  • Remove unused cachetools dependency

Fixed#

  • Fix benchmark code

  • Make fastexcel a polars extra

  • Drop click-params dependency

  • Make pyarrow a polars extra

0.102.0 - 2025-01-17#

Added#

  • Add cmd to docker image

Changed#

  • Use to_list()[0] instead of first()

0.101.0 - 2025-01-13#

Added#

  • Move more details into MetadataModel

Changed#

  • [DWD Obs] Make the download function more flexible using threadpool

  • [DWD Obs] Cleanup parser function

  • [DWD Obs] Improve fileindex and metaindex

Fixed#

  • [DWD Obs] Reduce unnecessary file index calls during retrieval of data for stations with multiple files

0.100.0 - 2025-01-06#

Added#

  • Add logo for restapi

  • Breaking: Add dedicated unit converter

    Attention: Many units are changed to be more consistent with typical meteorological units. We now use °C for temperatures. Also, length units are now separated in length_short, length_medium and length_long to get more reasonable decimals. For more information, see the new units chapter (usage/units) in the documentation.

Changed#

  • Add reasonable upper bounds for dependencies

Fixed#

  • Filter out invalid underscore prefixed files

0.99.0 - 2024-12-30#

Added#

  • Add setting ts_complete=False that allows to prevent building a complete time series

Changed#

  • Docs: Change to markdown using mkdocs

  • Settings: Switch to pydantic_settings for settings management

  • Improve wetterdienst api class

  • Dissolve wetterdienst notebook into examples

  • Use duckdb.sql and ask only for WHERE clause

  • Update restapi annotations

  • Use Settings in restapi/cli core functions

  • Restapi/Cli: Use pydantic models for request parameters

  • Rename dropna to drop_nulls

  • Change default of drop_nulls to True

  • Replace occurrences of dt.timezone.utc by ZoneInfo("UTC")

  • Improve release workflow using uv build and uv publish

  • Improve docker-publish workflow to use uv build

0.98.0 - 2024-12-09#

Added#

  • Add support for Python 3.13

Changed#

  • Breaking: Add new metadata model: Requests now use parameters instead of parameter and resolution e.g. parameters=[("daily", "kl")] instead of parameter="kl", resolution="daily"

Deprecated#

  • Deprecate Python 3.9

0.97.0 - 2024-10-06#

Fixed#

  • DWD Road: Use correct 15 minute resolution

0.96.0 - 2024-10-04#

Changed#

  • Bump polars to >=1.0.0

  • Change DWDMosmixValues and DWDDmoValues to follow the core _collect_station_parameter method

  • Allow only single issue retrieving with DWDMosmixRequest and DWDDmoRequest

0.95.1 - 2024-09-04#

Fixed#

  • Fix state column in station list creation for DWD Observation

0.95.0 - 2024-08-27#

Changed#

  • Make fastexcel non-optional

  • Remove upper dependency bounds

0.94.0 - 2024-08-10#

Added#

  • DWD Road: Add new station groups, log warning if no data is available, especially if the station group is one of the temporarily unavailable ones

Fixed#

  • Explorer: Fix DWD Mosmix request kwargs setup

0.93.0 - 2024-08-06#

Fixed#

  • Fix multiple Geosphere parameter and unit enums

  • Explorer: Fix wrap (parameter, dataset) in iterator

  • Adjust parameter typing of apis

0.92.0 - 2024-07-31#

Changed#

  • Rename parameters

    • units in parameter names are now directly following the number

    • temperature parameters now use meter instead of cm and also have a unit

    • e.g. TEMPERATURE_AIR_MEAN_2M, CLOUD_COVER_BETWEEN_2KM_TO_7KM, PROBABILITY_PRECIPITATION_HEIGHT_GT_0_0MM_LAST_6H

Fixed#

  • Bump pyarrow version to <18

  • Fix EaHydrology station list parsing

  • Rename EaHydrology to EAHydrology

  • Fix propagation of settings through EAHydrology values

0.91.0 - 2024-07-14#

Fixed#

  • Fix DWD Road api

0.90.0 - 2024-07-14#

Changed#

  • Bump environs to <12

Fixed#

  • Explorer: Fix json export

0.89.0 - 2024-07-03#

Fixed#

  • EaHydrology: Fix date parsing

  • Hubeau: Use correct frequency unit

  • Fix group by unpack

0.88.0 - 2024-06-14#

Added#

  • Allow passing --listen when running the explorer to specify the host and port

0.87.0 - 2024-06-06#

Added#

  • Add precipitation version

Changed#

  • Rename warming stripes to climate stripes

  • Replace custom Settings class with pydantic model

0.86.0 - 2024-06-01#

Changed#

  • Interpolation/Summary: Require start and end date

  • Enable interpolation and summarization for all services

Fixed#

  • Fix multiple issues with interpolation and summarization

0.85.0 - 2024-05-29#

Fixed#

  • Fix dropna argument for DWD Mosmix and DMO

  • Adjust DWD Mosmix and DMO kml reader to parse all parameters

  • Fix to_target(duckdb) for stations

  • Fix init of DwdDmoRequest

0.84.0 - 2024-05-15#

Fixed#

  • Fix DWD Obs station list parsing again

0.83.0 - 2024-04-26#

Added#

  • Allow wide shape with multiple datasets

0.82.0 - 2024-04-25#

Fixed#

  • Adjust column specs for DWD Observation station listing

  • Maintain order during deduplication

  • Change threshold in filter_by_name to 0.0…1.0

0.81.0 - 2024-04-09#

Added#

  • Warming stripes: Add option to enable/disable showing only active stations

0.80.0 - 2024-04-08#

Added#

  • Migrate explorer to streamlit

  • UI: Add warming stripes

Changed#

  • Explorer: Disable higher than daily resolutions for hosted version

0.79.0 - 2024-03-21#

Fixed#

  • Fix parsing of DWD Observation stations where name contains a comma

0.78.0 - 2024-03-09#

Added#

  • Docker: Install more extras

Fixed#

  • Cli/Restapi: Return empty values if no data is available

0.77.1 - 2024-03-08#

Fixed#

  • Fix setting NOAA GHCN-h date to UTC

0.77.0 - 2024-03-08#

Changed#

  • Refactor index caching -> Remove monkeypatch for fsspec

0.76.1 - 2024-03-03#

Fixed#

  • NOAA GHCN Hourly: Fix date parsing

0.76.0 - 2024-03-02#

Added#

  • Add NOAA GHCN Hourly API (also known as ISD)

0.75.0 - 2024-02-25#

Changed#

  • Remove join outer workaround for polars and use outer_coalesce instead

  • Allow duckdb for Python 3.12 again

  • Update REST API index layout

  • Bump polars to 0.20.10

  • Docker: Bump to Python 3.12

  • Docker: Reduce image size

0.74.0 - 2024-02-22#

Added#

  • Restapi: Add health check endpoint

0.73.0 - 2024-02-09#

Changed#

  • Set upper version bound for Python to 4.0

  • Make pandas optional

Fixed#

  • Add temporary workaround for bugged line in IMGW Hydrology station list

  • Fix parsing of dates in NOAA GHCN api

0.72.0 - 2024-01-13#

Added#

  • Allow for passing kwargs to the to_csv method

Fixed#

  • Fix issue when using force_ndarray_like=True with pint UnitRegistry

0.71.0 - 2024-01-03#

Added#

  • CI: Add support for Python 3.12

Fixed#

  • Fix issue with DWD DMO api

0.70.0 - 2023-12-30#

Added#

  • Docker: Enable interpolation in wetterdienst standard image

Changed#

  • Replace partial with lambda in most places

  • IMGW: Use ttl of 5 minutes for caching

Fixed#

  • IMGW Meteorology: Drop workaround for mixed up station list to fix issue

  • WSV Hydrology: Fix issue with station list characteristic values

  • DWD Observation: Remove redundant replace empty string in parser

  • NWS Observation: Read json data from bytes

  • EA Hydrology: Read json data from bytes

0.69.0 - 2023-12-18#

Added#

  • Restapi: Unify station parameter and add alias

  • Interpolation: Make maximum station distance per parameter configurable via settings

Fixed#

  • Result: Convert date to string only if dataframe is not empty

  • Restapi: Move restapi from /restapi to /api

0.68.0 - 2023-12-01#

Added#

  • Add example for comparing Mosmix forecast and Observation data

Fixed#

  • Fix parsing of DWD Observation 1 minute precipitation data

0.67.0 - 2023-11-17#

Changed#

  • Breaking: Use start_date and end_date instead of from_date and to_date

  • Use artificial station id for interpolation and summarization

  • Rename taken station ids columns for interpolation and summarization

0.66.1 - 2023-11-08#

Fixed#

  • Add workaround for issue with DWD Observation station lists

0.66.0 - 2023-11-07#

Added#

  • Add lead time argument - one of short, long - for DWD DMO to address two versions of icon

Changed#

  • Rework dict-like export formats and tests with extensive support for typing

  • Improve radar access

  • Style restapi landing page

  • Replace timezonefinder by tzfpy

Fixed#

  • Fix DWD DMO access again

0.65.0 - 2023-10-24#

Changed#

  • Cleanup error handling

  • Make cli work with DwdDmoRequest API

  • Cleanup cli docs

Fixed#

  • Fix DWD Observation API for 5 minute data

0.64.0 - 2023-10-12#

Added#

  • Export: Add support for InfluxDB 3.x

Changed#

  • Remove direct tzdata dependency

  • Replace pandas read_fwf calls by polars substitutes

0.63.0 - 2023-10-08#

Added#

  • [Streamlit] Add sideboard with settings

  • [Streamlit] Add station information json

  • [Streamlit] Add units to DataFrame view and plots

  • [Streamlit] Add JSON download

Fixed#

  • Return data correctly sorted

0.62.0 - 2023-10-07#

Changed#

  • Raise minimum version of polars to 0.19.6 due to breaking changes

Fixed#

  • Fix multiple issues with DwdObservationRequest API

0.61.0 - 2023-10-06#

Added#

  • Make parameters TEMPERATURE_AIR_MAX_200 and TEMPERATURE_AIR_MIN_200 summarizable/interpolatable

  • Add streamlit app for DWD climate stations

  • Add sql query function to streamlit app

Fixed#

  • Fix imgw meteorology station list parsing

  • Improve streamlit app plotting capabilities

  • Fix DWD DMO api

0.60.0 - 2023-09-16#

Added#

  • Add implementation for DWD DMO

0.59.3 - 2023-09-11#

Fixed#

  • Fix DWD solar date string correction

0.59.2 - 2023-09-06#

Fixed#

  • Fix documentation and unit conversion for Geosphere 10minute radiation data

0.59.1 - 2023-07-18#

Fixed#

  • Fix Geosphere parameter names

0.59.0 - 2023-07-30#

Changed#

  • Revise type hints for parameter and station_id

Fixed#

  • Fix Geosphere Observation parsing of dates in values -> thanks to @mhuber89 who discovered the bug and delivered a fix

0.58.1 - 2023-07-26#

Fixed#

  • Fix bug with Geosphere parameter case

0.58.0 - 2023-07-10#

Added#

  • Add retry to functions

  • Add IMGW Hydrology API

  • Add IMGW Meteorology API

Changed#

  • Rename FLOW to DISCHARGE and WATER_LEVEL to STAGE everywhere

0.57.1 - 2023-06-28#

Fixed#

  • Fix pyarrow dependency

0.57.0 - 2023-05-15#

Added#

  • Sources: Add DWD Road Weather data

Changed#

  • Breaking: Backend: Migrate from pandas to polars

    Switching to Polars may cause breaking changes for certain user-space code heavily using pandas idioms, because Wetterdienst now returns a Polars DataFrame. If you absolutely must use a pandas DataFrame, you can cast the Polars DataFrame to pandas by using the .to_pandas() method.

0.56.2 - 2023-05-11#

Fixed#

  • Fix Unit definition for RADIATION_GLOBAL

0.56.1 - 2023-05-10#

Fixed#

  • Fix JOULE_PER_SQUARE_METER definition from kilojoule/m2 to joule/m2

0.56.0 - 2023-05-02#

Fixed#

  • Update docker images

  • Fix now and now_local attributes on core class

0.55.2 - 2023-04-20#

Fixed#

  • Fix precipitation index interpolation

0.55.1 - 2023-04-17#

Fixed#

  • Fix setting empty values in DWD observation data

  • Fix DWD Radar composite path

0.55.0 - 2023-03-19#

Changed#

  • Drop Python 3.8 support

Fixed#

  • Explorer: Fix function calls

0.54.1 - 2023-03-13#

Fixed#

  • Fix DWD Observations 1 minute fileindex

0.54.0 - 2023-03-06#

Changed#

  • SCALAR: Improve handling skipping of empty stations, especially within .filter_by_rank function

  • Make all parameter levels equal for all weather services to reduce complexity in code

  • Change tidy option to shape, where shape="long" equals tidy=True and shape="wide" equals tidy=False

  • Naming things: All things “Scalar” are now called “Timeseries”, with settings prefix ts_

  • Drop some unnecessary enums

  • Rename Environment Agency to ea in subspace

Fixed#

  • CLI: Fix cli arguments with multiple items separated by comma (,)

  • Fix fileindex/metaindex for DWD Observation

  • DOCS: Fix precipitation height unit

  • DOCS: Fix examples with “recent” period

0.53.0 - 2023-02-07#

Added#

  • CLI: Add command line options wetterdienst --version and wetterdienst -v to display version number

Changed#

  • SCALAR: Change tidy option to be set to True if multiple different entire datasets are queried (in accordance with exporting results to json where multiple DataFrames are concatenated)

  • Further cleanups

  • Change Settings to be provided via initialization instead of having a singleton

0.52.0 - 2023-01-19#

Added#

  • Add Geosphere Observation implementation for Austrian meteorological data

Changed#

  • RADAR: Clean up code and merge access module into api

Fixed#

  • DWD MOSMIX: Fix parsing station list

  • DWD MOSMIX: Fix converting degrees minutes to decimal degrees within the stations list. The previous method did not produce correct results on negative lat/lon values.

0.51.0 - 2023-01-01#

Added#

  • Update wetterdienst explorer with clickable stations and slightly changed layout

Fixed#

  • Improve radar tests and certain dict comparisons

  • Fix problem with numeric column names in method gain_of_value_pairs

0.50.0 - 2022-12-03#

Added#

  • Interpolation/Summary: Now the queried point can be an existing station laying on the border of the polygon that it’s being checked against

  • UI: Add interpolate/summarize methods as subspaces

Changed#

  • Geo: Change function signatures to use latlon tuple instead of latitude and longitude

  • Geo: Enable querying station id instead of latlon within interpolate and summarize

  • Geo: Allow using values of nearby stations instead of interpolated values

Fixed#

  • Fix timezone related problems when creating full date range

0.49.0 - 2022-11-28#

Added#

  • Add NOAA NWS Observation API

  • Add Eaufrance Hubeau API for French river data (flow, stage)

Fixed#

  • Fix bug where duplicates of acquired data would be dropped regarding only the date but not the parameter

  • Fix NOAA GHCN access issues with timezones and empty data

0.48.0 - 2022-11-11#

Added#

  • Add example to dump DWD climate summary observations in zarr with help of xarray

Fixed#

  • Fix DWD Observation urban_pressure dataset access (again)

0.47.1 - 2022-10-23#

Fixed#

  • Fix DWD Observation urban_pressure dataset access

0.47.0 - 2022-10-14#

Added#

  • Add support for reading DWD Mosmix-L all stations files

0.46.0 - 2022-10-14#

Added#

  • Add summary of multiple weather stations for a given lat/lon point (currently only works for DWDObservationRequest)

0.45.2 - 2022-10-11#

Fixed#

  • Make DwdMosmixRequest return data according to start and end date

0.45.1 - 2022-10-10#

Fixed#

  • Fix passing an empty DataFrame through unit conversion and ensure set of columns

0.45.0 - 2022-09-22#

Added#

  • Add interpolation of multiple weather stations for a given lat/lon point (currently only works for DWDObservationRequest)

Fixed#

  • Fix access of DWD Observation climate_urban datasets

0.44.0 - 2022-09-18#

Added#

  • Add DWD Observation climate_urban datasets

Changed#

  • Slightly adapt the conversion function to satisfy linter

  • Adjust Docker images to fix build problems, now use python 3.10 as base

  • Adjust NOAA sources to AWS as NCEI sources currently are not available

  • Make explorer work again for all services setting up Period enum classes instead of single instances of Period for period base

Fixed#

  • Fix parameter names:

    • we now use consistently INDEX instead of INDICATOR

    • index and form got mixed up with certain parameters, where actually index was measured/given but not the form

    • global radiation was mistakenly named radiation_short_wave_direct at certain points, now it is named correctly

0.43.0 - 2022-09-05#

Added#

  • Add DWD Observation climate_urban datasets

Changed#

  • Use lxml.iterparse to reduce memory consumption when parsing DWD Mosmix files

  • Fix Settings object instantiation

  • Change logging level for Settings.cache_disable to INFO

0.42.1 - 2022-08-25#

Fixed#

  • Fix DWD Mosmix station locations

0.42.0 - 2022-08-22#

Changed#

  • Move cache settings to core wetterdienst Settings object

Fixed#

  • Fix two parameter names

0.41.1 - 2022-08-04#

Fixed#

  • Fix correct mapping of periods for solar daily data which should also have Period.HISTORICAL besides Period.RECENT

0.41.0 - 2022-07-24#

Fixed#

  • Fix passing through of empty dataframe when trying to convert units

0.40.0 - 2022-07-10#

Changed#

  • Update dependencies

0.39.0 - 2022-06-27#

Changed#

  • Update dependencies

0.38.0 - 2022-06-09#

Added#

  • Add DWD Observation 5 minute precipitation dataset

  • Add test to compare actually provided DWD observation datasets with the ones we made available with wetterdienst

Fixed#

  • Fix one particular dataset which was not correctly included in our DWD observations resolution-dataset-mapping

0.37.0 - 2022-06-06#

Fixed#

  • Fix EA hydrology access

  • Update ECCC observation methods to acquire station listing

0.36.0 - 2022-05-31#

Fixed#

  • Fix using shared FSSPEC_CLIENT_KWARGS everywhere

0.35.0 - 2022-05-29#

Added#

  • Add option to skip empty stations (option tidy must be set)

  • Add option to drop empty rows (value is NaN) (option tidy must be set)

0.34.0 - 2022-05-22#

Added#

  • Add UKs Environment Agency hydrology API

0.33.0 - 2022-05-14#

Fixed#

  • Fix acquisition of DWD weather phenomena data

  • Set default encoding when reading data from DWD with pandas to ‘latin1’

  • Fix typo in EcccObservationResolution

0.32.4 - 2022-05-14#

Fixed#

  • Fix acquisition of historical DWD radolan data that comes in archives

0.32.3 - 2022-05-12#

Fixed#

  • Fix creation of empty DataFrame for missing station ids

  • Fix creation of empty DataFrame for annual data

0.32.2 - 2022-05-10#

Fixed#

  • Revert ssl option

0.32.1 - 2022-05-09#

Fixed#

  • Circumvent DWD server ssl certificate problem by temporary removing ssl verification

0.32.0 - 2022-04-24#

Added#

  • Add implementation of WSV Pegelonline service

Changed#

  • Clean up code at several places

Fixed#

  • Fix ECCC observations access

0.31.1 - 2022-04-03#

Fixed#

  • Change integer dtypes in untidy format to float to prevent loosing information when converting units

0.31.0 - 2022-03-29#

Changed#

  • Improve integrity of dataset, parameter and unit enumerations with further tests

  • Change source of hourly sunshine duration to dataset sun

  • Change source of hourly total cloud cover (+indicator) to dataset cloudiness

0.30.1 - 2022-03-03#

Fixed#

  • Fix naming of sun dataset

  • Fix DWD Observation monthly test

0.30.0 - 2022-02-27#

Fixed#

  • Fix monthly/annual data of DWD observations

0.29.0 - 2022-02-27#

Added#

  • Add datasets EXTREME_WIND (subdaily) and MORE_WEATHER_PHENOMENA (daily)

  • Add support for Python 3.10

Changed#

  • Simplify parameters using only one enumeration for flattened and detailed parameters

  • Rename dataset SUNSHINE_DURATION to SUN to avoid complications with similar named parameter and dataset

  • Rename parameter VISIBILITY to VISIBILITY_RANGE

Removed#

  • Drop Python 3.7 support

0.28.0 - 2022-02-19#

Added#

  • Extend explorer to use all implemented APIs

Fixed#

  • Fix cli/restapi: return json and use NULL instead of NaN

0.27.0 - 2022-02-16#

Added#

  • Add support for Python 3.10

Fixed#

  • Fix missing station ids within values result

  • Add details about time interval for NOAA GHCN stations

  • Fix falsely calculated station distances

Removed#

  • Drop support for Python 3.7

0.26.0 - 2022-02-06#

Added#

  • Add Wetterdienst.Settings to manage general settings like tidy, humanize,…

  • Instead of “kind” use “network” attribute to differ between different data products of a provider

Changed#

  • Rename DWD forecast to mosmix

Fixed#

  • Change data source of NOAA GHCN after problems with timeouts when reaching the server

  • Fix problem with timezone conversion when having dates that are already timezone aware

0.25.1 - 2022-01-30#

Fixed#

  • Fix cli error with upgraded click ^8.0 where default False would be converted to “False”

0.25.0 - 2022-01-30#

Fixed#

  • Fix access to ECCC stations listing using Google Drive storage

  • Remove/replace caching entirely by fsspec (+monkeypatch)

  • Fix bug with DWD intervals

0.24.0 - 2022-01-24#

Added#

  • Add NOAA GHCN API

Fixed#

  • Fix radar index by filtering out bz2 files

0.23.0 - 2021-11-21#

Fixed#

  • Add missing positional dataset argument for _create_empty_station_parameter_df

  • Timestamps of 1 minute / 10 minutes DWD data now have a gap hour at the end of year 1999 due to timezone shifts

0.22.0 - 2021-10-01#

Added#

  • Introduce core Parameter enum with fixed set of parameter names. Several parameters may have been renamed!

  • Add FSSPEC_CLIENT_KWARGS variable at wetterdienst.util.cache for passing extra settings to fsspec request client

0.21.0 - 2021-09-10#

Changed#

  • Start migrating from dogpile.cache to filesystem_spec

0.20.4 - 2021-08-07#

Added#

  • Enable selecting a parameter precisely from a dataset by passing a tuple like [(“precipitation_height”, “kl”)] or [(“precipitation_height”, “precipitation_more”)], or for cli/restapi use “precipitation_height/kl”

  • Rename wetterdienst show to wetterdienst info, make version accessible via CLI with wetterdienst version

Fixed#

  • Bug when querying an entire DWD dataset for 10_minutes/1_minute resolution without providing start_date/end_date, which results in the interval of the request being None

  • Test of restapi with recent period

  • Get rid of pandas performance warning from DWD Mosmix data

0.20.3 - 2021-07-15#

Fixed#

  • Bugfix acquisition of DWD radar data

  • Adjust DWD radar composite parameters to new index

0.20.2 - 2021-06-26#

Fixed#

  • Bugfix tidy method for DWD observation data

0.20.1 - 2021-06-26#

Changed#

  • Update readme on sandbox developer installation

Fixed#

  • Bugfix show method

0.20.0 - 2021-06-23#

Added#

  • Change cli base to click

  • Add support for wetterdienst core API in cli and restapi

  • Export: Use InfluxDBClient instead of DataFrameClient and improve connection handling with InfluxDB 1.x

  • Export: Add support for InfluxDB 2.x

  • Add show() method with basic information on the wetterdienst instance

Fixed#

  • Fix InfluxDB export by skipping empty fields

0.19.0 - 2021-05-14#

Changed#

  • Make tidy method a abstract core method of Values class

Fixed#

  • Fix DWD Mosmix generator to return all contained dataframes

0.18.0 - 2021-05-04#

Added#

  • Add origin and si unit mappings to services

  • Use argument “si_units” in request classes to convert origin units to si, set to default

  • Improve caching behaviour by introducing optional WD_CACHE_DIR and WD_CACHE_DISABLE environment variables. Thanks, @meteoDaniel!

  • Add baseline test for ECCC observations

  • Add DWD Observation hourly moisture to catalogue

0.17.0 - 2021-04-08#

Added#

  • Add capability to export data to Zarr format

  • Add Wetterdienst Explorer UI. Thanks, @meteoDaniel!

  • Add MAC ARM64 support with dependency restrictions

  • Add support for stations filtering via bbox and name

  • Add support for units in distance filtering

Changed#

  • Rename station_name to name

  • Rename filter methods to .filter_by_station_id and .filter_by_name, use same convention for bbox, filter_by_rank ( previously nearby_number), filter_by_distance (nearby_distance)

Fixed#

  • Radar: Verify HDF5 responses instead of returning invalid data

  • Mosmix: Use cached stations to improve performance

0.16.1 - 2021-03-31#

Changed#

  • Make .discover return lowercase parameters and datasets

0.16.0 - 2021-03-29#

Added#

  • Add capability to export to Feather- and Parquet-files to I/O subsystem

  • Add --reload parameter to wetterdienst restapi for supporting development

  • Add Environment and Climate Change Canada API

Changed#

  • Use direct mapping to get a parameter set for a parameter

  • Rename DwdObservationParameterSet to DwdObservationDataset as well as corresponding columns

  • Merge metadata access into Request

  • Repair CLI and I/O subsystem

  • Improve spreadsheet export

  • Increase I/O subsystem test coverage

  • Make all DWD observation field names lowercase

  • Make all DWD forecast (mosmix) field names lowercase

  • Rename humanize_parameters to humanize and tidy_data to tidy

Deprecated#

  • Deprecate support for Python 3.6

Fixed#

  • Radar: Use OPERA as data source for improved list of radar sites

0.15.0 - 2021-03-07#

Added#

  • Add StationsResult and ValuesResult to allow for new workflow and connect stations and values request

  • Add accessor .values to Stations class to get straight to values for a request

  • Add top-level API

Fixed#

  • Fix issue with Mosmix station location

0.14.1 - 2021-02-21#

Fixed#

  • Fix date filtering of DWD observations, where accidentally an empty dataframe was returned

0.14.0 - 2021-02-05#

Added#

  • DWD: Add missing radar site “Emden” (EMD, wmo=10204)

Changed#

  • Change key STATION_HEIGHT to HEIGHT, LAT to LATITUDE, LON to LONGITUDE

  • Rename “Data” classes to “Values”

  • Make arguments singular

Fixed#

  • Mosmix stations: fix longitudes/latitudes to be decimal degrees (before they were degrees and minutes)

0.13.0 - 2021-01-21#

Added#

  • Create general Resolution and Period enumerations that can be used anywhere

  • Create a full dataframe even if no values exist at requested time

  • Add further attributes to the class structure

  • Make dates timezone aware

  • Restrict dates to isoformat

0.12.1 - 2020-12-29#

Fixed#

  • Fix 10minutes file index interval range by adding timezone information

0.12.0 - 2020-12-23#

Changed#

  • Move more functionality into core classes

  • Add more attributes to the core e.g. source and timezone

  • Make dates of internal data timezone aware, set start date and end date to UTC

  • Add issue date to Mosmix class that actually refers to the Mosmix run instead of start date and end date

  • Use Result object for every data related return

  • In accordance with typical naming conventions, DWDObservationSites is renamed to DWDObservationStations, the same is applied to DWDMosmixSites

  • The name ELEMENT is removed and replaced by parameter while the actual parameter set e.g. CLIMATE_SUMMARY is now found under PARAMETER_SET

Removed#

  • Remove StorageAdapter and its dependencies

  • Methods self.collect_data() and self.collect_safe() are replaced by self.query() and self.all() and will deprecate at some point

0.11.1 - 2020-12-10#

Fixed#

  • Bump h5py to version 3.1.0 in order to satisfy installation on Python 3.9

0.11.0 - 2020-12-04#

Added#

  • Upgrade Docker images to Python 3.8.6

  • Radar data: Add non-RADOLAN data acquisition

Changed#

  • Change wherever possible column type to category

  • Increase efficiency by downloading only historical files with overlapping dates if start_date and end_date are given

  • Use periods dynamically depending on start and end date

Fixed#

  • InfluxDB export: Fix export in non-tidy format (#230). Thanks, @wetterfrosch!

  • InfluxDB export: Use “quality” column as tag (#234). Thanks, @wetterfrosch!

  • InfluxDB export: Use a batch size of 50000 to handle larger amounts of data (#235). Thanks, @wetterfrosch!

  • Update radar examples to use wradlib>=1.9.0. Thanks, @kmuehlbauer!

  • Fix inconsistency within 1 minute precipitation data where historical files have more columns

  • Improve DWD PDF parser to extract quality information and select language. Also, add an example at example/dwd_describe_fields.py as well as respective documentation.

  • Move intermediate storage of HDF out of data collection

  • Fix bug with date filtering for empty/no station data for a given parameter

0.10.1 - 2020-11-14#

Fixed#

  • Upgrade to dateparser-1.0.0. Thanks, @steffen746, @noviluni and @Gallaecio! This fixes a problem with timezones on Windows. The reason is that Windows has no zoneinfo database and tzlocal switched from pytz to tzinfo. https://github.com/earthobservations/wetterdienst/issues/222

0.10.0 - 2020-10-26#

Added#

  • CLI: Obtain “–tidy” argument from command line

  • Extend MOSMIX support to equal the API of observations

  • DWDObservationData now also takes an individual parameter independent of the pre-configured DWD datasets by using DWDObservationParameter or similar names e.g. “precipitation_height”

  • Newly introduced coexistence of DWDObservationParameter and DWDObservationParameterSet to address parameter sets as well as individual parameters

Changed#

  • DWDObservationSites now filters for those stations which have a file on the server

  • Imports are changed to submodule thus now one has to import everything from wetterdienst.dwd

  • Renaming of time_resolution to resolution, period_type to period, several other relabels

0.9.0 - 2020-10-09#

Added#

  • Rename DWDStationRequest to DWDObservationData

  • Add DWDObservationSites API wrapper to acquire station information

  • Move discover_climate_observations to DWDObservationMetadata.discover_parameters

  • Add PDF-based DWDObservationMetadata.describe_fields()

Changed#

  • Large refactoring

  • Make period type in DWDObservationData and cli optional

  • Activate SQL querying again by using DuckDB 0.2.2.dev254. Thanks, @Mytherin!

Fixed#

  • Fix coercion of integers with nans

  • Fix problem with storing IntegerArrays in HDF

0.8.0 - 2020-09-25#

Added#

  • Add TTL-based persistent caching using dogpile.cache

  • Add example/radolan.py and adjust documentation

  • Export dataframe to different data sinks like SQLite, DuckDB, InfluxDB and CrateDB

  • Query results with SQL, based on in-memory DuckDB

  • Split get_nearby_stations into two functions, get_nearby_stations_by_number and get_nearby_stations_by_distance

  • Add MOSMIX client and parser. Thanks, @jlewis91!

  • Add basic HTTP API

0.7.0 - 2020-09-16#

Added#

  • Add test for Jupyter notebook

  • Add function to discover available climate observations (time resolution, parameter, period type)

  • Make the CLI work again and add software tests to prevent future havocs

  • Use Sphinx Material theme for documentation

Fixed#

  • Fix typo in enumeration for TimeResolution.MINUTES_10

0.6.0 - 2020-09-07#

Changed#

  • Enhance usage of get_nearby_stations to check for availability

  • Output of get_nearby_stations is now a slice of meta_data DataFrame output

0.5.0 - 2020-08-27#

Added#

  • Add RADOLAN support

  • Change module and function naming in accordance with RADOLAN

0.4.0 - 2020-08-03#

Added#

  • Extend DWDObservationData to take multiple parameters as request

  • Add documentation at readthedocs.io

  • [cli] Adjust methods to work with multiple parameters

0.3.0 - 2020-07-26#

Added#

  • Add option for data collection to tidy the DataFrame (properly reshape) with the “tidy_data” keyword and set it to be used as default

Changed#

  • Establish code style black

  • Setup nox session that can be used to run black via nox -s black for one of the supported Python versions

Fixed#

  • Fix integer type casting for cases with nans in the column/series

  • Fix humanizing of column names for tidy data

0.2.0 - 2020-07-23#

Added#

  • [cli] Add geospatial filtering by distance.

  • [cli] Filter stations by station identifiers.

  • [cli] Add GeoJSON output format for station data.

  • Improvements to parsing high resolution data by setting specific datetime formats and changing to concurrent.futures

Changed#

  • Change column name mapping to more explicit one with columns being individually addressable

  • Add full column names for every individual parameter

  • More specific type casting for integer fields and string fields

Fixed#

  • Fix na value detection for cases where cells have leading and trailing whitespace

0.1.1 - 2020-07-05#

Added#

  • [cli] Add geospatial filtering by number of nearby stations.

  • Simplify release pipeline

  • Small updates to readme

Changed#

  • Parameter, time resolution and period type can now also be passed as strings of the enumerations e.g. “ climate_summary” or “CLIMATE_SUMMARY” for Parameter.CLIMATE_SUMMARY

  • Enable selecting nearby stations by distance rather than by number of stations

Fixed#

  • Change updating “parallel” argument to be done after parameter parsing to prevent mistakenly not found parameter

  • Remove find_all_match_strings function and extract functionality to individual operations

0.1.0 - 2020-07-02#

Added#

  • Initial release

  • Update README.md

  • Update example notebook

  • Add Gh Action for release

  • Rename library