Weather moves sales. Umbrellas and soup sell when it rains, garden furniture and ice cream when it is warm, and delivery times slip when there is ice or storm. In Germany the best source for this is the Deutscher Wetterdienst (DWD), which publishes station observations and its MOSMIX forecasts as free open data.
The catch: the raw files are station-based archives and KMZ forecast files, not something you drop into a spreadsheet. This guide shows how to get one flat row per city and hour, past and forecast, and what to do with it.
Disclosure: I built the tool used below, German Weather Data (DWD Open Data) on Apify. It reads DWD data through the free open-source Bright Sky API. Credit "Deutscher Wetterdienst" when you publish the data.
Step 1: get hourly rows for your cities
One HTTP call, three cities:
curl -X POST "https://api.apify.com/v2/acts/fast_data_asap~german-weather-dwd-open-data/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"locations": ["Hamburg", "Köln", "München"], "mode": "hourly", "maxHoursPerLocation": 48}'
I ran exactly this on 7 November 2026. It took about 3 seconds and returned 144 rows: 48 hours per city, of which 14 were measured and 34 were forecast. Each city is matched to the nearest DWD station, and the distance is included:
{
"location": "Hamburg",
"stationName": "Hamburg-Fuhlsbüttel",
"distanceKm": 9.2,
"timestamp": "2026-11-07T00:00:00+01:00",
"temperatureC": 5.5,
"precipitationMm": 0,
"windSpeedKmh": 20.5,
"windGustKmh": 35.6,
"cloudCoverPct": 100,
"sunshineMin": 0,
"relativeHumidityPct": 78,
"pressureHpa": 1028.9,
"condition": "dry",
"isForecast": false
}
The forecast part for the next day and a half looked like this:
| City | Station | Forecast min/max °C | Forecast rain | Max gusts |
|---|---|---|---|---|
| Hamburg | Hamburg-Fuhlsbüttel | 2.1 / 6.4 | 0 mm | 20 km/h |
| Köln | Köln/Bonn | 4.5 / 9.8 | 0.3 mm | 24 km/h |
| München | München-Stadt | 4.2 / 8.8 | 0.3 mm | 13 km/h |
Locations can be city names (the 50 largest German cities are built in), 5-digit postal codes, "lat,lon" strings or objects with your own names. Postal codes are matched approximately, to the city centre of their region.
Step 2: turn it into daily features
For forecasting you usually want one row per day and region, not per hour:
import pandas as pd
rows = [...] # dataset items from step 1
df = pd.DataFrame(rows)
df["date"] = pd.to_datetime(df["timestamp"]).dt.date
daily = df.groupby(["location", "date"]).agg(
temp_max=("temperatureC", "max"),
temp_min=("temperatureC", "min"),
rain_mm=("precipitationMm", "sum"),
sunshine_h=("sunshineMin", lambda s: s.sum() / 60),
gust_max=("windGustKmh", "max"),
is_forecast=("isForecast", "max"),
).reset_index()
print(daily)
Join daily with your sales or orders per region and day, and you have a dataset you can feed to any forecasting model, or simply look at.
What teams actually use this for
-
Demand planning in retail and e-commerce: add
temp_max,rain_mmandsunshine_has features next to day of week and promotions. Seasonal categories such as garden, outdoor, heating and drinks react strongly. -
Delivery and field-service planning: high
windGustKmh, sub-zero temperatures or heavy rain in the forecast are an early warning to plan extra time or staff. -
Energy and solar:
sunshineMinand cloud cover per region are a simple proxy for expected solar output. - Events and hospitality: a two-day forecast per venue city helps with staffing and stock.
Automating it in n8n or Make
- Schedule Trigger, daily at 06:00.
-
HTTP Request to the endpoint above, with your Apify token as a Header Auth credential (
Authorization: Bearer …), listing your warehouse or store cities. - Code node: aggregate to daily rows as in step 2.
- Google Sheets or database node: append the forecast rows, and on the next day overwrite them with the measured values.
After a few weeks you have your own history of "what was forecast" next to "what happened", which is exactly what you need to judge how much weather really moves your numbers.
Cost and limits
It costs $0.001 per location returned; unknown cities give a free error row. The underlying data comes from DWD stations, so values describe the station, not your exact street. Forecasts are model outputs and can be wrong, so don't use them for safety-critical decisions.
Data: Deutscher Wetterdienst open data via Bright Sky, run on 7 November 2026. Check the current DWD open-data terms on opendata.dwd.de before publishing derived data.
Top comments (0)