Dieses Skript wurde mit Hilfe von KI erstellt.
Load packages
library(tidyverse)Load data
Data Source: Deutscher Wetterdienst (DWD), Climate Data Center, opendata.dwd.de, License: CC BY 4.0
klimakenntage_url <- "https://raw.githubusercontent.com/sebastiansauer/data_se/refs/heads/master/content/post/2026-08-14-wetterdaten-des-dwd-aufbereiten/klimakenntage_bundesland_jahr.csv"Klimakenntage
# Frost-/Sommer-/Eistage, Tropennaechte und Starkregentage liegen beim DWD
# erst ab 1951 vor; nur "trocken_monate" (abgeleitet aus den Monatsnieder-
# schlaegen) reicht weiter zurueck. Auf 1951+ filtern, damit alle Indikatoren
# in den Facet-Plots dieselbe x-Achse (Jahr) haben.
klimakenntage <- read_csv(klimakenntage_url) |>
filter(Jahr >= 1951)Data Dictionary: DWD Jahreswerte – Klimakenntage
Quelle: klimakenntage_bundesland_jahr.csv
| Spalte | Typ | Beschreibung |
|---|---|---|
Jahr | integer | Kalenderjahr der Beobachtung |
Bundesland | character | Deutsches Bundesland (regionaler Mittelwert) |
Wert | double | Anzahl der Tage im jeweiligen Jahr, die das Kriterium des Indikators erfüllen |
Indikator | character | Kenntag-Typ, siehe Codebuch unten |
Codebuch Indikator
Wert in Indikator | DWD-Kürzel | Deutsche Bezeichnung | Definition |
|---|---|---|---|
frost_days | FD | Frosttage | Tmin < 0 °C |
ice_days | ID | Eistage | Tmax < 0 °C |
summer_days | SU | Sommertage | Tmax ≥ 25 °C |
hot_days | — | Heiße Tage | Tmax ≥ 30 °C |
tropical_nights | TR | Tropennächte | Tmin ≥ 20 °C |
precipGE10mm_days | — | Starkregentage (≥10 mm) | Tagesniederschlag ≥ 10 mm |
precipGE20mm_days | — | Starkregentage (≥20 mm) | Tagesniederschlag ≥ 20 mm |
trocken_monate | — | Trockenmonate | Anzahl Monate/Jahr mit Niederschlag unter dem 20%-Quantil des Bundeslands |
Hinweis: Tmin/Tmax beziehen sich auf die Tagesminimum-/Tagesmaximumtemperatur der Lufttemperatur in 2 m Höhe. Die Werte sind regionale Jahresmittel je Bundesland, wie vom DWD (Climate Data Center, regional_averages_DE) bereitgestellt.
Auswertung Frosttage
klimakenntage |>
group_by(Indikator, Jahr) |>
summarise(Wert_avg = mean(Wert, na.rm = TRUE)) |>
ungroup() |>
filter(Indikator == "frost_days") |>
ggplot(aes(x = Jahr, y = Wert_avg)) +
geom_line() +
geom_smooth()
Auswertung Tropennächte
klimakenntage |>
group_by(Indikator, Jahr) |>
summarise(Wert_avg = mean(Wert)) |>
ungroup() |>
filter(Indikator == "tropical_nights") |>
ggplot(aes(x = Jahr, y = Wert_avg)) +
geom_line() +
geom_smooth()
Auswertung alle Indikatoren
klimakenntage |>
group_by(Indikator, Jahr) |>
summarise(Wert_avg = mean(Wert, na.rm = TRUE)) |>
ungroup() |>
ggplot(aes(x = Jahr, y = Wert_avg, color = Indikator)) +
geom_line() +
geom_smooth() +
facet_wrap(~ Indikator, scales = "free_y") +
labs(x = "Jahr", y = "Mittlere Anzahl Tage") +
theme(legend.position = "none")
Auswertung pro Bundesland und Indikator
klimakenntage |>
ggplot(aes(x = Jahr, y = Wert, color = Bundesland)) +
geom_line() +
facet_wrap(~ Indikator, scales = "free_y") +
labs(x = "Jahr", y = "Anzahl Tage")
Auswertung für Deutschland insgesamt
klimakenntage |>
group_by(Indikator, Jahr) |>
summarise(Wert_avg = mean(Wert, na.rm = TRUE)) |>
ungroup() |>
ggplot(aes(x = Jahr, y = Wert_avg)) +
geom_line() +
geom_smooth() +
facet_wrap(~ Indikator, scales = "free_y") +
labs(x = "Jahr", y = "Mittlere Anzahl Tage (Deutschland)")
Vergleich mit langfristigen Trends
Referenzperiode: WMO-Standard 1991–2020. Für jeden Indikator wird das Referenzmittel über diesen Zeitraum berechnet (gemittelt über alle Bundesländer) und die jährliche Abweichung davon dargestellt.
ref_start <- 1991
ref_end <- 2020
referenz_kenntage <- klimakenntage |>
filter(Jahr >= ref_start, Jahr <= ref_end) |>
group_by(Indikator) |>
summarise(Referenzmittel = mean(Wert, na.rm = TRUE), .groups = "drop")
abweichung_jahr <- klimakenntage |>
group_by(Indikator, Jahr) |>
summarise(Wert_avg = mean(Wert, na.rm = TRUE), .groups = "drop") |>
left_join(referenz_kenntage, by = "Indikator") |>
mutate(Abweichung = Wert_avg - Referenzmittel)abweichung_jahr |>
ggplot(aes(x = Jahr, y = Abweichung, fill = Abweichung > 0)) +
geom_col() +
facet_wrap(~ Indikator, scales = "free_y") +
scale_fill_manual(values = c(`TRUE` = "firebrick", `FALSE` = "steelblue"), guide = "none") +
labs(
title = paste("Abweichung vom Referenzmittel", ref_start, "-", ref_end),
x = "Jahr", y = "Abweichung (Tage) zum Referenzmittel"
)