Python examples#

DWD: Historical weather observations#

Get available parameters for daily historical data of DWD:

In [1]: from wetterdienst import Resolution, Period

In [2]: from wetterdienst.provider.dwd.observation import DwdObservationRequest

In [3]: observations_meta = DwdObservationRequest.discover(
   ...:     resolution=Resolution.DAILY,
   ...: )
   ...: 

# Available parameter sets
In [4]: print(observations_meta)
{'daily': {'wind_gust_max': {'origin': 'm / s', 'si': 'm / s'}, 'wind_speed': {'origin': 'm / s', 'si': 'm / s'}, 'precipitation_height': {'origin': 'mm', 'si': 'kg / m ** 2'}, 'precipitation_form': {'origin': '-', 'si': '-'}, 'sunshine_duration': {'origin': 'hr', 'si': 's'}, 'snow_depth': {'origin': 'cm', 'si': 'm'}, 'cloud_cover_total': {'origin': '1/8', 'si': 'pct'}, 'pressure_vapor': {'origin': 'hPa', 'si': 'Pa'}, 'pressure_air_site': {'origin': 'hPa', 'si': 'Pa'}, 'temperature_air_mean_200': {'origin': '°C', 'si': 'K'}, 'humidity': {'origin': 'pct', 'si': 'pct'}, 'temperature_air_max_200': {'origin': '°C', 'si': 'K'}, 'temperature_air_min_200': {'origin': '°C', 'si': 'K'}, 'temperature_air_min_005': {'origin': '°C', 'si': 'K'}, 'snow_depth_new': {'origin': 'cm', 'si': 'm'}, 'temperature_soil_mean_002': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_005': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_010': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_020': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_050': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_100': {'origin': '°C', 'si': 'K'}, 'radiation_sky_long_wave': {'origin': 'J / cm ** 2', 'si': 'J / m ** 2'}, 'radiation_sky_short_wave_diffuse': {'origin': 'J / cm ** 2', 'si': 'J / m ** 2'}, 'radiation_global': {'origin': 'J / cm ** 2', 'si': 'J / m ** 2'}, 'snow_depth_excelled': {'origin': 'cm', 'si': 'm'}, 'water_equivalent_snow_depth': {'origin': 'mm', 'si': 'kg / m ** 2'}, 'water_equivalent_snow_depth_excelled': {'origin': 'mm', 'si': 'kg / m ** 2'}, 'count_weather_type_fog': {'origin': '-', 'si': '-'}, 'count_weather_type_thunder': {'origin': '-', 'si': '-'}, 'count_weather_type_storm_strong_wind': {'origin': '-', 'si': '-'}, 'count_weather_type_storm_stormier_wind': {'origin': '-', 'si': '-'}, 'count_weather_type_dew': {'origin': '-', 'si': '-'}, 'count_weather_type_glaze': {'origin': '-', 'si': '-'}, 'count_weather_type_ripe': {'origin': '-', 'si': '-'}, 'count_weather_type_sleet': {'origin': '-', 'si': '-'}, 'count_weather_type_hail': {'origin': '-', 'si': '-'}}}

# Available individual parameters
In [5]: observations_meta = DwdObservationRequest.discover(
   ...:     resolution=Resolution.DAILY, flatten=False
   ...: )
   ...: 

In [6]: print(observations_meta)
{'daily': {'climate_summary': {'quality_wind': {'origin': '-', 'si': '-'}, 'wind_gust_max': {'origin': 'm / s', 'si': 'm / s'}, 'wind_speed': {'origin': 'm / s', 'si': 'm / s'}, 'quality_general': {'origin': '-', 'si': '-'}, 'precipitation_height': {'origin': 'mm', 'si': 'kg / m ** 2'}, 'precipitation_form': {'origin': '-', 'si': '-'}, 'sunshine_duration': {'origin': 'hr', 'si': 's'}, 'snow_depth': {'origin': 'cm', 'si': 'm'}, 'cloud_cover_total': {'origin': '1/8', 'si': 'pct'}, 'pressure_vapor': {'origin': 'hPa', 'si': 'Pa'}, 'pressure_air_site': {'origin': 'hPa', 'si': 'Pa'}, 'temperature_air_mean_200': {'origin': '°C', 'si': 'K'}, 'humidity': {'origin': 'pct', 'si': 'pct'}, 'temperature_air_max_200': {'origin': '°C', 'si': 'K'}, 'temperature_air_min_200': {'origin': '°C', 'si': 'K'}, 'temperature_air_min_005': {'origin': '°C', 'si': 'K'}}, 'precipitation_more': {'quality': {'origin': '-', 'si': '-'}, 'precipitation_height': {'origin': 'mm', 'si': 'kg / m ** 2'}, 'precipitation_form': {'origin': '-', 'si': '-'}, 'snow_depth': {'origin': 'cm', 'si': 'm'}, 'snow_depth_new': {'origin': 'cm', 'si': 'm'}}, 'solar': {'quality': {'origin': '-', 'si': '-'}, 'radiation_sky_long_wave': {'origin': 'J / cm ** 2', 'si': 'J / m ** 2'}, 'radiation_sky_short_wave_diffuse': {'origin': 'J / cm ** 2', 'si': 'J / m ** 2'}, 'radiation_global': {'origin': 'J / cm ** 2', 'si': 'J / m ** 2'}, 'sunshine_duration': {'origin': 'hr', 'si': 's'}}, 'temperature_soil': {'quality': {'origin': '°C', 'si': '-'}, 'temperature_soil_mean_002': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_005': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_010': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_020': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_050': {'origin': '°C', 'si': 'K'}, 'temperature_soil_mean_100': {'origin': '°C', 'si': 'K'}}, 'water_equivalent': {'qn_6': {'origin': '-', 'si': '-'}, 'snow_depth_excelled': {'origin': 'cm', 'si': 'm'}, 'snow_depth': {'origin': 'cm', 'si': 'm'}, 'water_equivalent_snow_depth': {'origin': 'mm', 'si': 'kg / m ** 2'}, 'water_equivalent_snow_depth_excelled': {'origin': 'mm', 'si': 'kg / m ** 2'}}, 'weather_phenomena': {'quality': {'origin': '-', 'si': '-'}, 'count_weather_type_fog': {'origin': '-', 'si': '-'}, 'count_weather_type_thunder': {'origin': '-', 'si': '-'}, 'count_weather_type_storm_strong_wind': {'origin': '-', 'si': '-'}, 'count_weather_type_storm_stormier_wind': {'origin': '-', 'si': '-'}, 'count_weather_type_dew': {'origin': '-', 'si': '-'}, 'count_weather_type_glaze': {'origin': '-', 'si': '-'}, 'count_weather_type_ripe': {'origin': '-', 'si': '-'}, 'count_weather_type_sleet': {'origin': '-', 'si': '-'}, 'count_weather_type_hail': {'origin': '-', 'si': '-'}}, 'weather_phenomena_more': {'quality': {'origin': '-', 'si': '-'}, 'count_weather_type_sleet': {'origin': '-', 'si': '-'}, 'count_weather_type_hail': {'origin': '-', 'si': '-'}, 'count_weather_type_fog': {'origin': '-', 'si': '-'}, 'count_weather_type_thunder': {'origin': '-', 'si': '-'}}}}

Get stations for daily historical precipitation:

In [7]: from wetterdienst import Resolution, Period

In [8]: from wetterdienst.provider.dwd.observation import DwdObservationDataset

In [9]: stations = DwdObservationRequest(
   ...:     parameter=DwdObservationDataset.PRECIPITATION_MORE,
   ...:     resolution=Resolution.DAILY,
   ...:     period=Period.HISTORICAL
   ...: )
   ...: 

In [10]: print(stations.all().df.head())
  station_id  ...                state
0      00001  ...    Baden-Württemberg
1      00002  ...  Nordrhein-Westfalen
2      00003  ...  Nordrhein-Westfalen
3      00004  ...  Nordrhein-Westfalen
4      00006  ...    Baden-Württemberg

[5 rows x 8 columns]

Get data for a dataset:

In [11]: from wetterdienst import Resolution, Period

In [12]: from wetterdienst.provider.dwd.observation import DwdObservationDataset

In [13]: stations = DwdObservationRequest(
   ....:     parameter=DwdObservationDataset.PRECIPITATION_MORE,
   ....:     resolution=Resolution.DAILY,
   ....:     period=Period.HISTORICAL
   ....: )
   ....: 

In [14]: print(next(stations.all().values.query()))
ValuesResult(df=       station_id             dataset  ... value quality
0           00001  precipitation_more  ...   0.0     1.0
1           00001  precipitation_more  ...   0.2     1.0
2           00001  precipitation_more  ...   0.0     1.0
3           00001  precipitation_more  ...   1.0     1.0
4           00001  precipitation_more  ...   2.1     1.0
...           ...                 ...  ...   ...     ...
105915      00001  precipitation_more  ...   0.0    10.0
105916      00001  precipitation_more  ...   0.0    10.0
105917      00001  precipitation_more  ...   0.0    10.0
105918      00001  precipitation_more  ...   0.0    10.0
105919      00001  precipitation_more  ...   0.0    10.0

[105920 rows x 6 columns], stations=StationsResult(df=     station_id  ...                state
0         00001  ...    Baden-Württemberg
1         00002  ...  Nordrhein-Westfalen
2         00003  ...  Nordrhein-Westfalen
3         00004  ...  Nordrhein-Westfalen
4         00006  ...    Baden-Württemberg
...         ...  ...                  ...
5646      19356  ...            Thüringen
5647      19364  ...            Thüringen
5648      19365  ...        Niedersachsen
5649      19378  ...            Thüringen
5650      19399  ...      Rheinland-Pfalz

[5651 rows x 8 columns]))

Get data for a parameter:

In [15]: from wetterdienst import Resolution, Period

In [16]: from wetterdienst.provider.dwd.observation import DwdObservationParameter

In [17]: observation_data = DwdObservationRequest(
   ....:     parameter=DwdObservationParameter.DAILY.PRECIPITATION_HEIGHT,
   ....:     resolution=Resolution.DAILY,
   ....:     period=Period.HISTORICAL
   ....: )
   ....: 

In [18]: print(next(stations.all().values.query()))
ValuesResult(df=       station_id             dataset  ... value quality
0           00001  precipitation_more  ...   0.0     1.0
1           00001  precipitation_more  ...   0.2     1.0
2           00001  precipitation_more  ...   0.0     1.0
3           00001  precipitation_more  ...   1.0     1.0
4           00001  precipitation_more  ...   2.1     1.0
...           ...                 ...  ...   ...     ...
105915      00001  precipitation_more  ...   0.0    10.0
105916      00001  precipitation_more  ...   0.0    10.0
105917      00001  precipitation_more  ...   0.0    10.0
105918      00001  precipitation_more  ...   0.0    10.0
105919      00001  precipitation_more  ...   0.0    10.0

[105920 rows x 6 columns], stations=StationsResult(df=     station_id  ...                state
0         00001  ...    Baden-Württemberg
1         00002  ...  Nordrhein-Westfalen
2         00003  ...  Nordrhein-Westfalen
3         00004  ...  Nordrhein-Westfalen
4         00006  ...    Baden-Württemberg
...         ...  ...                  ...
5646      19356  ...            Thüringen
5647      19364  ...            Thüringen
5648      19365  ...        Niedersachsen
5649      19378  ...            Thüringen
5650      19399  ...      Rheinland-Pfalz

[5651 rows x 8 columns]))

Get data for a parameter from another dataset:

In [19]: from wetterdienst import Resolution, Period

In [20]: from wetterdienst.provider.dwd.observation import DwdObservationRequest

In [21]: observation_data = DwdObservationRequest(
   ....:     parameter=[("precipitation_height", "precipitation_more")],
   ....:     resolution=Resolution.DAILY,
   ....:     period=Period.HISTORICAL
   ....: )
   ....: 

In [22]: print(next(stations.all().values.query()))
ValuesResult(df=       station_id             dataset  ... value quality
0           00001  precipitation_more  ...   0.0     1.0
1           00001  precipitation_more  ...   0.2     1.0
2           00001  precipitation_more  ...   0.0     1.0
3           00001  precipitation_more  ...   1.0     1.0
4           00001  precipitation_more  ...   2.1     1.0
...           ...                 ...  ...   ...     ...
105915      00001  precipitation_more  ...   0.0    10.0
105916      00001  precipitation_more  ...   0.0    10.0
105917      00001  precipitation_more  ...   0.0    10.0
105918      00001  precipitation_more  ...   0.0    10.0
105919      00001  precipitation_more  ...   0.0    10.0

[105920 rows x 6 columns], stations=StationsResult(df=     station_id  ...                state
0         00001  ...    Baden-Württemberg
1         00002  ...  Nordrhein-Westfalen
2         00003  ...  Nordrhein-Westfalen
3         00004  ...  Nordrhein-Westfalen
4         00006  ...    Baden-Württemberg
...         ...  ...                  ...
5646      19356  ...            Thüringen
5647      19364  ...            Thüringen
5648      19365  ...        Niedersachsen
5649      19378  ...            Thüringen
5650      19399  ...      Rheinland-Pfalz

[5651 rows x 8 columns]))

DWD: MOSMIX forecasts#

Get stations for MOSMIX-SMALL:

In [23]: from wetterdienst import Resolution, Period

In [24]: from wetterdienst.provider.dwd.mosmix import DwdMosmixRequest, DwdMosmixType

In [25]: stations = DwdMosmixRequest(parameter="large", mosmix_type=DwdMosmixType.LARGE)

In [26]: print(stations.all().df.head())
  station_id icao_id from_date  ... longitude           name  state
0      01001    ENJA       NaT  ...     -8.67      JAN MAYEN    NaN
1      01008    ENSB       NaT  ...     15.47       SVALBARD    NaN
2      01025     NaN       NaT  ...     18.92        TROMSOE    NaN
3      01028    ENBJ       NaT  ...     19.02       BJORNOYA    NaN
4      01049    ENAT       NaT  ...     23.37  ALTA LUFTHAVN    NaN

[5 rows x 9 columns]

Get data for MOSMIX-LARGE:

In [27]: from wetterdienst import Resolution, Period

In [28]: from wetterdienst.provider.dwd.mosmix import DwdMosmixRequest, DwdMosmixType

In [29]: stations = DwdMosmixRequest(parameter="large", mosmix_type=DwdMosmixType.LARGE).filter_by_station_id(
   ....:     station_id=["01001", "01008"]
   ....: )
   ....: 

In [30]: print(stations.values.all().df.head())
  station_id dataset  ...     value quality
0      01001   large  ...  100940.0     NaN
1      01001   large  ...  101010.0     NaN
2      01001   large  ...  101080.0     NaN
3      01001   large  ...  101160.0     NaN
4      01001   large  ...  101190.0     NaN

[5 rows x 6 columns]