Load packages
Vier Pakete: tidyverse fürs Datenwrangling und Plotten, rdwd für
den Zugriff auf die DWD-Server, tinytable für die Tabellen im Post
und ggpubr für das einheitliche Plot-Theme.
library(tidyverse)
library(rdwd)
library(tinytable)
library(ggpubr)
theme_set(theme_pubr())Daten
Der DWD stellt im Climate Data Center
Tagesklimadaten (u. a. Temperaturmittel/-minimum/-maximum und
Niederschlag) je Wetterstation frei zum Download an
(observations_germany/climate/daily/kl/), aufgeteilt in
historical/ (abgeschlossene Jahre) und recent/ (laufendes Jahr plus
die letzten ca. 500 Tage). Ein fertiges Deutschland-Tagesmittel bietet
der DWD dafür nicht an – das gibt es nur auf Monats-/Jahresebene unter
regional_averages_DE/ (bereits im vorherigen Post genutzt). Für den
Sommer 2026 wird hier deshalb selbst ein einfaches Tagesmittel über je
eine Station pro Bundesland gebildet, mit Hilfe des R-Pakets
{rdwd}, das den Zugriff auf die
DWD-Server kapselt.
Monatskontext: Sommer 2026 im langfristigen Vergleich
Als Einordnung zunächst die Monatsmittel für Deutschland, wie sie im
vorherigen Post (wetterdaten_monat.csv) aufbereitet wurden.
Monatsdaten laden
Hier stehen die Daten des DWD bereit – die bereits im Vorpost aufbereitete CSV mit Monatsmitteln je Bundesland wird direkt von GitHub nachgeladen:
wetterdaten_monat <- read_csv(
"https://raw.githubusercontent.com/sebastiansauer/data_se/refs/heads/master/content/post/2026-08-14-wetterdaten-des-dwd-aufbereiten/wetterdaten_monat.csv",
show_col_types = FALSE
)Datenquelle: Deutscher Wetterdienst (DWD), Climate Data Center, opendata.dwd.de, Lizenz: CC BY 4.0
Referenzmittel berechnen
Berechnen wir die Temperatur und Niederschlag für den Sommer 2026 (Juni, Juli) - im Vergleich zu einem langjährigen Referenzwert. Zuerst nur die Zeilen für Deutschland insgesamt behalten und die Referenzperiode festlegen.
deutschland_monat <- wetterdaten_monat |>
filter(region == "Deutschland")
ref_start <- 1991
ref_end <- 2020Referenzmittel je Monat berechnen, gemittelt über die WMO-Normalperiode 1991–2020.
klimatologie_monat <- deutschland_monat |>
filter(year >= ref_start, year <= ref_end) |>
group_by(month) |>
summarise(
temp_ref = mean(temp, na.rm = TRUE),
precip_ref = mean(precip, na.rm = TRUE),
.groups = "drop"
)Sommer 2026 vs. Referenzmittel
Sommer 2026 herausfiltern und dem Referenzmittel gegenüberstellen.
sommer_2026 <- deutschland_monat |>
filter(year == 2026, month %in% 6:8) |>
left_join(klimatologie_monat, by = "month") |>
mutate(
temp_abw = temp - temp_ref, # Abweichung vom Referenzmittel
monatsname = month.name[month]
)Als Tabelle:
sommer_2026 |>
select(monatsname, temp, temp_ref, temp_abw, precip, precip_ref) |>
tt() |>
format_tt(digits = 2)| monatsname | temp | temp_ref | temp_abw | precip | precip_ref |
|---|---|---|---|---|---|
| June | 19 | 16 | 3 | 66 | 76 |
| July | 20 | 18 | 1.2 | 44 | 87 |
Temperaturverlauf im Plot
Zunächst die Sommermitteltemperatur je Jahr berechnen.
sommer_temp_jahr <- deutschland_monat |>
filter(month %in% 6:8) |>
group_by(year) |>
summarise(sommer_temp = mean(temp, na.rm = TRUE), .groups = "drop")Im Jahresverlauf geplottet, der aktuelle Sommer (2026) ist farbig
markiert, dazu ein dezenter geglätteter Trend (geom_smooth(), ohne
Konfidenzband, dünn und grau, damit er die Datenpunkte nicht
überdeckt).
sommer_temp_jahr |>
ggplot(aes(x = year, y = sommer_temp)) +
geom_line(color = "grey60") +
geom_smooth(se = FALSE, color = "grey30", linewidth = 0.7) +
geom_point(aes(color = year == 2026), size = 4) +
scale_color_manual(values = c(`TRUE` = "firebrick", `FALSE` = "grey40"), guide = "none") +
labs(
title = "Sommermitteltemperatur (Jun-Aug) Deutschland",
x = NULL, y = "Temperatur (°C)"
)
Hinweis: Der Wert für 2026 basiert auf den bislang verfügbaren Monatsdaten (Juni + Juli), der August ist beim DWD auf Monatsebene noch nicht veröffentlicht. Er liegt schon jetzt auf dem Niveau der bisherigen Rekordsommer.
Tagesdaten: Hitzewellen im Sommer 2026
Stationsauswahl: je Bundesland wird die Station mit der längsten
laufenden Messreihe herangezogen (per == "recent"), mit bis zu 5
Ausweichkandidaten, falls eine Station in den letzten 90 Tagen zu
viele fehlende Temperaturwerte hat (manche automatischen Stationen
liefern TXK/TNK nicht durchgängig).
Data Dictionary: DWD Tageswerte (Datensatz kl)
Quelle: DWD Climate Data Center, observations_germany/climate/daily/kl/
(Metadatendatei Metadaten_Parameter_klima_tag_<ID>.txt in jedem
Stations-ZIP). Fehlwert-Code -999, wird von readDWD() automatisch
zu NA.
| Kürzel | Bedeutung | Einheit |
|---|---|---|
STATIONS_ID | Stations-ID | — |
MESS_DATUM | Messdatum | Datum |
QN_3 | Qualitätsniveau der Parameter FX, FM | Code |
FX | Windspitze (max. Böe des Tages) | m/s |
FM | Windgeschwindigkeit, Tagesmittel | m/s |
QN_4 | Qualitätsniveau der übrigen Parameter (RSK…TGK) | Code |
RSK | Niederschlagshöhe, Tagessumme | mm |
RSKF | Niederschlagsform (0=kein, 1=Regen, 4=Mischform, 6=Regenschauer, 7=Schnee, 8=Schneeschauer, 9=Hagel …) | Code |
SDK | Sonnenscheindauer, Tagessumme | h |
SHK_TAG | Schneehöhe | cm |
NM | Bedeckungsgrad, Tagesmittel | Achtel |
VPM | Dampfdruck, Tagesmittel | hPa |
PM | Luftdruck (Stationsniveau), Tagesmittel | hPa |
TMK | Lufttemperatur 2 m, Tagesmittel | °C |
UPM | Relative Luftfeuchte, Tagesmittel | % |
TXK | Lufttemperatur 2 m, Tagesmaximum | °C |
TNK | Lufttemperatur 2 m, Tagesminimum | °C |
TGK | Lufttemperatur 5 cm über Boden, Tagesminimum | °C |
eor | Zeilenende-Marker (“end of record”) | — |
Für die Auswertung unten genutzt: TXK (Kriterium Hitzetag ≥ 30 °C),
TNK (Kriterium Tropennacht ≥ 20 °C), TMK (Tagesmittel) und RSK
(Niederschlag, aktuell nur mitgeführt, nicht separat ausgewertet).
Messstationen auswählen
Je Bundesland die 5 Stationen mit der längsten laufenden Messreihe als Kandidaten vormerken (nicht nur die eine “beste”, falls diese später unvollständige Werte liefert).
Kandidaten ermitteln
data("metaIndex") # Stellt Infos zu den Messtationen bereit (z.B. Lage der Messstation)
kandidaten <- metaIndex |>
filter(res == "daily", var == "kl", per == "recent", hasfile) |>
distinct(Stations_id, Bundesland, von_datum) |>
arrange(Bundesland, von_datum) |>
group_by(Bundesland) |>
slice_head(n = 5) |>
summarise(ids = list(Stations_id), .groups = "drop")Hilfsfunktion: Station laden
Hilfsfunktion, die die Tageswerte einer einzelnen Station herunterlädt und einliest.
lade_station <- function(id) {
link <- selectDWD(id = id, res = "daily", var = "kl", per = "recent")
file <- dataDWD(link, read = FALSE, dir = tempdir(), quiet = TRUE)
readDWD(file, varnames = FALSE) |>
as_tibble() |>
transmute(
Stations_id = STATIONS_ID,
Datum = MESS_DATUM,
TXK, TNK, TMK, RSK
)
}Hilfsfunktion: beste Station wählen
Hilfsfunktion, die die Kandidaten der Reihe nach durchprobiert und die erste brauchbare Station zurückgibt: die erste, bei der in den letzten 90 Tagen mehr als 80 % der Tagesmaxima (TXK) tatsächlich vorhanden sind.
waehle_station <- function(ids) {
for (id in ids) {
df <- tryCatch(lade_station(id), error = function(e) NULL)
if (is.null(df) || nrow(df) == 0) next
letzte_90 <- df |> filter(Datum >= max(Datum) - 90)
if (mean(!is.na(letzte_90$TXK)) > 0.8) return(df)
}
NULL
}Stationsdaten zusammenstellen
Für jedes Bundesland wird jetzt tatsächlich eine Station geladen.
stationsdaten <- kandidaten |>
mutate(daten = map(ids, waehle_station)) |>
select(-ids) |>
unnest(daten)Hinweis:
“kl” steht für Klimatageswerte – das ist der DWD-interne Kürzel für den Datensatz mit den kombinierten täglichen Klimastationswerten (Temperatur, Niederschlag, Sonnenschein, Wind, Luftdruck etc. in einer Datei je Station).
Aus den 16 gewählten Stationen wird nun je Tag ein einfaches bundesweites Mittel gebildet (ungewichtete Mittelung über die Stationen) und auf den Zeitraum ab Sommer 2025 zugeschnitten – das reicht für den Vergleich Sommer 2025 vs. 2026 weiter unten.
Wetterdaten pro Tag
Bundesweites Tagesmittel
deutschland_tag <- stationsdaten |>
group_by(Datum) |>
summarise(
TXK = mean(TXK, na.rm = TRUE),
TNK = mean(TNK, na.rm = TRUE),
TMK = mean(TMK, na.rm = TRUE),
RSK = mean(RSK, na.rm = TRUE),
.groups = "drop"
)
deutschland_tag |>
head() |>
tt()| Datum | TXK | TNK | TMK | RSK |
|---|---|---|---|---|
| 2025-02-11 | 5.27500 | -0.66875 | 2.21250 | 0.93750 |
| 2025-02-12 | 3.37500 | -0.71250 | 1.27500 | 0.65625 |
| 2025-02-13 | 2.08125 | -2.33750 | -0.05625 | 2.12500 |
| 2025-02-14 | 1.54375 | -1.98125 | -0.24375 | 0.11250 |
| 2025-02-15 | 1.35000 | -2.71875 | -0.58125 | 0.27500 |
| 2025-02-16 | 0.97500 | -5.19375 | -1.76250 | 0.37500 |
Zeitraum zuschneiden
Zeitraum ab Sommer 2025 zuschneiden – das reicht für den Vergleich Sommer 2025 vs. 2026 weiter unten.
sommer_tage <- deutschland_tag |>
filter(Datum >= as.Date("2025-06-01"))Hitzetage (Tagesmaximum ≥ 30 °C)
Hilfsfunktion: Länge einer Hitzewelle
Hilfsfunktion für die längste zusammenhängende Hitzewelle:
rle() (“run-length encoding”) zählt Längen zusammenhängender
TRUE/FALSE-Serien – hier die längste Serie aufeinanderfolgender
Hitzetage (TXK ≥ Schwelle).
hitzewelle_laenge <- function(txk, schwelle = 30) {
ist_heiss <- !is.na(txk) & txk >= schwelle
laengen <- rle(ist_heiss)
max(c(0, laengen$lengths[laengen$values]))
}Hitzetage und Hitzewellen je Sommer
Daten je Sommer, sowie die längste zusammenhängende Hitzewelle (aufeinanderfolgende Hitzetage):
sommer_tage |>
mutate(jahr = year(Datum), monat = month(Datum)) |>
filter(monat %in% 6:8) |>
group_by(jahr) |>
summarise(
hitzetage = sum(TXK >= 30, na.rm = TRUE),
tropennaechte = sum(TNK >= 20, na.rm = TRUE),
laengste_hitzewelle = hitzewelle_laenge(TXK[order(monat)]),
.groups = "drop"
) |>
tt() |>
format_tt(digits = 1)| jahr | hitzetage | tropennaechte | laengste_hitzewelle |
|---|---|---|---|
| 2025 | 7 | 0 | 3 |
| 2026 | 17 | 2 | 5 |
Tagesmaxima im Vergleich
Die Tagesmaxima beider Sommer im direkten Vergleich, ausgerichtet auf den Tag im Jahr (Sommer 2025 vs. 2026 an derselben x-Position), dazu je Jahr ein dezenter geglätteter Trend (gestrichelt, dünn, ohne Konfidenzband).
sommer_tage |>
filter(month(Datum) %in% 6:8) |>
ggplot(aes(x = yday(Datum), y = TXK, color = factor(year(Datum)))) +
geom_hline(yintercept = 30, linetype = "dashed", color = "firebrick") +
geom_line(alpha = 0.5) +
geom_smooth(se = FALSE, linewidth = 0.8, linetype = "solid") +
labs(
title = "Tagesmaximaltemperatur Deutschland, Sommer 2025 vs. 2026",
subtitle = "Gestrichelte Linie: Hitzetag-Schwelle (30 °C)",
x = "Tag im Jahr", y = "Tagesmaximum (°C)", color = "Jahr"
)
Da der Sommer 2026 zum Zeitpunkt dieser Auswertung (15.08.) noch nicht vorbei ist, sind die Werte für 2026 bislang nur bis Mitte August gezählt – die Vergleichszahlen für 2025 sind entsprechend vollständiger.
Jeder Tag im Sommer 2026 vs. langjähriger Referenzwert (1991-2020)
Für einen echten Tageswert-Vergleich reicht per = "recent" nicht
aus (deckt nur gut 1,5 Jahre ab). Für dieselben 16 Referenzstationen
werden deshalb zusätzlich die historical-Dateien geladen, daraus
für jeden Kalendertag (unabhängig vom Jahr) ein klimatologischer
Referenzwert über 1991-2020 gebildet – geglättet mit einem
±5-Tage-Fenster um den jeweiligen Tag des Jahres, um Tag-zu-Tag-Rauschen
zu reduzieren – und jedem Tag des Sommers 2026 gegenübergestellt.
Historische Tagesdaten laden
Dieselben 16 Stationen wie oben, aber diesmal die historical-Dateien.
ausgewaehlte_ids <- unique(stationsdaten$Stations_id)
lade_historisch <- function(id) {
link <- selectDWD(id = id, res = "daily", var = "kl", per = "historical")
file <- dataDWD(link, read = FALSE, dir = tempdir(), quiet = TRUE)
readDWD(file, varnames = FALSE) |>
as_tibble() |>
transmute(
Stations_id = STATIONS_ID,
Datum = MESS_DATUM,
TXK, TNK, TMK
)
}Für jede Station laden – falls eine Station keine historical-Datei
hat, wird sie via tryCatch() einfach übersprungen statt den ganzen
Chunk abzubrechen.
historisch <- map_dfr(ausgewaehlte_ids, function(id) {
tryCatch(lade_historisch(id), error = function(e) NULL)
})Daraus wieder ein bundesweites Tagesmittel bilden – diesmal über die komplette historische Zeitreihe.
deutschland_hist_tag <- historisch |>
group_by(Datum) |>
summarise(
TXK = mean(TXK, na.rm = TRUE),
TNK = mean(TNK, na.rm = TRUE),
TMK = mean(TMK, na.rm = TRUE),
.groups = "drop"
)Methodik: Wie entsteht der Referenzwert je Tag?
Referenzperiode: Als Bezugszeitraum dient 1991–2020 – die aktuelle WMO-Standardnormalperiode (30 Jahre), der weltweit übliche Maßstab dafür, was an einem Kalendertag “normal” ist.
Warum glätten? Ein einzelner Kalendertag (z. B. der 27. Juni) hat über 30 Jahre nur 30 bundesweite Tagesmittelwerte – statistisch wenig und tagesscharf stark verrauscht. Ein einzelner ungewöhnlich kühler oder warmer 27. Juni in den 1990ern würde den Referenzwert für genau diesen Tag spürbar verzerren.
Das ±5-Tage-Fenster: Statt nur des exakten Kalendertags wird ein Fenster von 5 Tagen davor bis 5 Tagen danach herangezogen. Für den 27. Juni fließen also alle Tage vom 22. Juni bis 2. Juli aus allen 30 Referenzjahren ein – bis zu 11 Tage × 30 Jahre ≈ 330 Werte statt nur 30. Der Mittelwert daraus ist der geglättete Referenzwert für “27. Juni”. Das folgt derselben Grundidee wie offizielle DWD/WMO-Klimanormalen (dort oft per harmonischer Glättung/Fourierreihen berechnet), hier vereinfacht als gleitendes Mittel über ein festes Tagesfenster.
Konkret berechnet die Funktion klimatologie_tag() für einen
Zieltag (doy_ziel, Tag des Jahres) den Abstand zu jedem Tag der
Referenzperiode, behandelt diesen Abstand zirkulär über den
Jahreswechsel hinweg (pmin(diff, 366 - diff), relevant z. B. für den
1. Januar, für den sonst die letzten Dezembertage fälschlich “weit
entfernt” wären), filtert auf Abstand ≤ 5 Tage und mittelt TXK/TNK/TMK
über die verbleibenden Zeilen. Jeder Sommertag 2026 bekommt so über
seinen Tag-des-Jahres (doy) per left_join() den passenden
geglätteten Referenzwert zugewiesen, woraus sich die Abweichung
(TMK - TMK_ref usw.) ergibt.
Referenzwert berechnen
Referenzperiode und Fenstergröße festlegen, dann alle Tage der
Referenzperiode mit ihrem Tag-des-Jahres (doy) versehen.
ref_start_tag <- 1991
ref_end_tag <- 2020
fenster <- 5 # Tage vor/nach dem Zieltag
hist_ref <- deutschland_hist_tag |>
filter(year(Datum) >= ref_start_tag, year(Datum) <= ref_end_tag) |>
mutate(doy = yday(Datum))Die Funktion, die für einen Zieltag den geglätteten Referenzwert berechnet (Details siehe Methodik oben).
klimatologie_tag <- function(doy_ziel) {
diff <- abs(hist_ref$doy - doy_ziel)
diff <- pmin(diff, 366 - diff) # zirkulaer um den Jahreswechsel
sel <- hist_ref[diff <= fenster, ]
tibble(
doy = doy_ziel,
TXK_ref = mean(sel$TXK, na.rm = TRUE),
TNK_ref = mean(sel$TNK, na.rm = TRUE),
TMK_ref = mean(sel$TMK, na.rm = TRUE)
)
}Referenzwert für jeden vorkommenden Tag des Sommers 2026 berechnen.
sommer_2026_tag <- deutschland_tag |>
filter(year(Datum) == 2026, month(Datum) %in% 6:8) |>
mutate(doy = yday(Datum))
klimatologie_sommer <- map_dfr(unique(sommer_2026_tag$doy), klimatologie_tag)Referenzwerte anfügen und die Abweichung berechnen.
sommer_2026_tag <- sommer_2026_tag |>
left_join(klimatologie_sommer, by = "doy") |>
mutate(
TXK_abw = TXK - TXK_ref,
TNK_abw = TNK - TNK_ref,
TMK_abw = TMK - TMK_ref
)Vergleich: 2026 vs. langjähriges Mittel
Variante der Hitzewellen-Grafik von oben: statt Sommer 2025 vs. 2026 hier 2026 direkt gegen den geglätteten langjährigen Referenzwert (1991-2020, siehe Methodik oben) – dieselben Tagesmaxima, nur mit dem langfristigen Mittel statt dem Vorjahr als Vergleichslinie.
klimatologie_vergleich <- sommer_2026_tag |>
select(Datum, TXK, TXK_ref) |>
pivot_longer(cols = c(TXK, TXK_ref), names_to = "reihe", values_to = "temperatur") |>
mutate(reihe = recode(reihe,
TXK = "2026 (tatsächlich)",
TXK_ref = "Referenzmittel 1991-2020"
))klimatologie_vergleich |>
ggplot(aes(x = Datum, y = temperatur, color = reihe)) +
geom_hline(yintercept = 30, linetype = "dashed", color = "grey50") +
geom_line(linewidth = 0.9) +
scale_color_manual(values = c(
"2026 (tatsächlich)" = "firebrick",
"Referenzmittel 1991-2020" = "grey40"
)) +
labs(
title = "Tagesmaximaltemperatur 2026 vs. langjähriger Referenzwert",
subtitle = "Gestrichelte Linie: Hitzetag-Schwelle (30 °C)",
x = NULL, y = "Tagesmaximum (°C)", color = NULL
)
Tägliche Abweichung als Balkendiagramm
Als Balkendiagramm über den Sommer: positive Abweichungen (rot) vs.
negative (blau), Tag für Tag, dazu ein dezenter geglätteter
Gesamttrend (aes(group = 1), damit die Glättung nicht durch die
rot/blau-Einfärbung der Balken in zwei Gruppen zerfällt).
sommer_2026_tag |>
ggplot(aes(x = Datum, y = TMK_abw, fill = TMK_abw > 0)) +
geom_col() +
geom_smooth(aes(group = 1), se = FALSE, color = "grey20", linewidth = 0.7) +
scale_fill_manual(values = c(`TRUE` = "firebrick", `FALSE` = "steelblue"), guide = "none") +
labs(
title = "Tagesmitteltemperatur 2026 vs. Referenzwert 1991-2020",
subtitle = "Abweichung je Tag, geglättet mit ±5-Tage-Fenster um den Kalendertag",
x = NULL, y = "Abweichung (°C)"
)
Kalenderansicht
Dieselbe Abweichung, als Kalender: eine Kachel je Tag, Füllfarbe als Funktion der Abweichung der Tagesmitteltemperatur vom langjährigen Referenzwert (blau = kühler, rot = wärmer als 1991-2020).
Kalenderdaten aufbereiten
Wochentags-Kürzel auf Deutsch, sowie Monat, Tagesnummer und Wochentag je Datum ableiten.
wochentag_de <- c("Mo", "Di", "Mi", "Do", "Fr", "Sa", "So")
kalender_daten <- sommer_2026_tag |>
mutate(
monat = factor(month(Datum), levels = 6:8, labels = c("Juni", "Juli", "August")),
tag = day(Datum),
wd_num = wday(Datum, week_start = 1), # 1 = Montag ... 7 = Sonntag
wochentag = factor(wochentag_de[wd_num], levels = wochentag_de)
)Zusätzlich die Position im Kalenderraster berechnen: in welcher Zeile (Woche) des Monats der jeweilige Tag steht.
kalender_daten <- kalender_daten |>
mutate(
# Wochentag, mit dem der Monat beginnt (noetig, um die Kalenderzeile
# des 1. Tags korrekt einzuruecken)
monatsbeginn_wd = wday(floor_date(Datum, "month"), week_start = 1),
# Woche im Monat: Tag + Verschiebung durch den Monatsbeginn, durch
# 7 geteilt und aufgerundet -> 1. Kalenderzeile, 2. Kalenderzeile, ...
kw_monat = ceiling((tag + monatsbeginn_wd - 1) / 7)
)Kalenderdiagramm
Die Kacheln selbst: eine Kachel je Tag, eingefärbt nach Abweichung.
kalender_plot <- ggplot(kalender_daten, aes(x = wochentag, y = -kw_monat, fill = TMK_abw)) +
geom_tile(color = "white", linewidth = 0.6) +
geom_text(aes(label = tag), size = 3, color = "grey20") +
scale_fill_gradient2(
low = "steelblue", mid = "grey95", high = "firebrick",
midpoint = 0, name = "Abweichung\n(°C)"
)Je Monat eine eigene Kalenderfläche (facet_wrap), Achsenbeschriftung
und Gitter für die Kalenderoptik ausgeblendet.
kalender_plot +
facet_wrap(~monat, ncol = 1, scales = "free_y") +
labs(
title = "Kalenderansicht: Tagesmitteltemperatur 2026 vs. Referenzwert 1991-2020",
x = NULL, y = NULL
) +
theme_minimal(base_size = 12) +
theme(
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
panel.grid = element_blank(),
strip.text = element_text(face = "bold")
)
Tageswerte Sommer 2026 vs. Referenzwert
Vollständige Tageswerte für den Sommer 2026, mit Referenzwert und Abweichung:
sommer_2026_tag |>
transmute(
Datum,
TXK, TXK_ref, TXK_abw,
TMK, TMK_ref, TMK_abw
) |>
tt() |>
format_tt(digits = 1)| Datum | TXK | TXK_ref | TXK_abw | TMK | TMK_ref | TMK_abw |
|---|---|---|---|---|---|---|
| 2026-06-01 | 23 | 21 | 2.27 | 18 | 16 | 2 |
| 2026-06-02 | 25 | 21 | 3.48 | 18 | 16 | 2.36 |
| 2026-06-03 | 20 | 21 | -0.84 | 16 | 16 | 0.2 |
| 2026-06-04 | 21 | 21 | -0.43 | 16 | 16 | 0.3 |
| 2026-06-05 | 20 | 22 | -1.08 | 15 | 16 | -1.17 |
| 2026-06-06 | 23 | 22 | 1.52 | 17 | 16 | 0.48 |
| 2026-06-07 | 21 | 22 | -0.48 | 17 | 17 | 0.05 |
| 2026-06-08 | 24 | 22 | 2.42 | 18 | 17 | 1.52 |
| 2026-06-09 | 20 | 22 | -1.98 | 15 | 17 | -1.03 |
| 2026-06-10 | 18 | 22 | -3.3 | 13 | 17 | -3.19 |
| 2026-06-11 | 18 | 22 | -3.41 | 13 | 17 | -3.18 |
| 2026-06-12 | 19 | 22 | -3.09 | 15 | 17 | -1.71 |
| 2026-06-13 | 22 | 22 | 0.37 | 17 | 17 | 0.43 |
| 2026-06-14 | 19 | 22 | -2.8 | 15 | 17 | -1.93 |
| 2026-06-15 | 19 | 22 | -2.74 | 14 | 17 | -2.29 |
| 2026-06-16 | 22 | 22 | 0.78 | 16 | 17 | -0.15 |
| 2026-06-17 | 25 | 22 | 3.81 | 19 | 17 | 2.63 |
| 2026-06-18 | 30 | 22 | 8.32 | 23 | 17 | 6.85 |
| 2026-06-19 | 33 | 22 | 11.32 | 25 | 17 | 8.7 |
| 2026-06-20 | 32 | 22 | 10.1 | 25 | 17 | 8.2 |
| 2026-06-21 | 30 | 22 | 8.33 | 24 | 17 | 6.77 |
| 2026-06-22 | 29 | 22 | 6.78 | 23 | 17 | 6.25 |
| 2026-06-23 | 29 | 22 | 7.08 | 23 | 17 | 6 |
| 2026-06-24 | 33 | 22 | 10.36 | 25 | 17 | 8.17 |
| 2026-06-25 | 33 | 22 | 10.27 | 26 | 17 | 9.12 |
| 2026-06-26 | 35 | 23 | 12.57 | 28 | 17 | 10.09 |
| 2026-06-27 | 38 | 23 | 15.01 | 30 | 18 | 12.04 |
| 2026-06-28 | 34 | 23 | 11.36 | 28 | 18 | 10.38 |
| 2026-06-29 | 27 | 23 | 3.67 | 22 | 18 | 4.22 |
| 2026-06-30 | 27 | 23 | 3.76 | 21 | 18 | 3.27 |
| 2026-07-01 | 25 | 24 | 1.39 | 20 | 18 | 1.43 |
| 2026-07-02 | 26 | 24 | 2.75 | 20 | 18 | 1.44 |
| 2026-07-03 | 23 | 24 | -0.65 | 18 | 18 | -0.48 |
| 2026-07-04 | 24 | 24 | 0.08 | 18 | 18 | -0.35 |
| 2026-07-05 | 24 | 24 | -0.02 | 19 | 18 | 0.57 |
| 2026-07-06 | 24 | 24 | 0.07 | 19 | 18 | 0.74 |
| 2026-07-07 | 26 | 24 | 1.99 | 21 | 18 | 2.19 |
| 2026-07-08 | 24 | 24 | 0.46 | 19 | 18 | 0.76 |
| 2026-07-09 | 25 | 23 | 1.24 | 19 | 18 | 0.86 |
| 2026-07-10 | 28 | 23 | 4.47 | 21 | 18 | 2.95 |
| 2026-07-11 | 28 | 23 | 5.17 | 22 | 18 | 4.02 |
| 2026-07-12 | 30 | 23 | 6.28 | 23 | 18 | 4.69 |
| 2026-07-13 | 30 | 23 | 6.56 | 23 | 18 | 4.98 |
| 2026-07-14 | 28 | 24 | 4.71 | 23 | 18 | 4.17 |
| 2026-07-15 | 28 | 24 | 3.95 | 22 | 19 | 3.38 |
| 2026-07-16 | 29 | 24 | 5.28 | 22 | 19 | 3.57 |
| 2026-07-17 | 28 | 24 | 4.44 | 21 | 19 | 2.46 |
| 2026-07-18 | 24 | 24 | 0.39 | 19 | 19 | 0.63 |
| 2026-07-19 | 22 | 24 | -2.52 | 17 | 19 | -2.24 |
| 2026-07-20 | 21 | 24 | -3.45 | 16 | 19 | -2.83 |
| 2026-07-21 | 24 | 25 | -1.06 | 17 | 19 | -1.91 |
| 2026-07-22 | 22 | 25 | -3.14 | 17 | 19 | -2.61 |
| 2026-07-23 | 22 | 25 | -3.03 | 17 | 19 | -2.89 |
| 2026-07-24 | 24 | 25 | -0.94 | 17 | 20 | -2.11 |
| 2026-07-25 | 29 | 25 | 4.17 | 21 | 20 | 1.21 |
| 2026-07-26 | 25 | 25 | 0.21 | 20 | 20 | 0.18 |
| 2026-07-27 | 23 | 25 | -2.15 | 18 | 20 | -1.29 |
| 2026-07-28 | 27 | 25 | 1.43 | 20 | 20 | 0.05 |
| 2026-07-29 | 33 | 25 | 7.99 | 25 | 20 | 5.01 |
| 2026-07-30 | 36 | 25 | 10.75 | 26 | 20 | 5.86 |
| 2026-07-31 | 30 | 25 | 4.21 | 23 | 20 | 2.85 |
| 2026-08-01 | 25 | 25 | -0.92 | 19 | 20 | -0.36 |
| 2026-08-02 | 27 | 25 | 1.73 | 20 | 20 | 0.69 |
| 2026-08-03 | 32 | 25 | 6.85 | 24 | 20 | 4.17 |
| 2026-08-04 | 32 | 25 | 6.77 | 25 | 20 | 5.54 |
| 2026-08-05 | 31 | 25 | 5.69 | 25 | 20 | 5.32 |
| 2026-08-06 | 26 | 25 | 1.19 | 21 | 20 | 1.58 |
| 2026-08-07 | 23 | 25 | -1.62 | 18 | 20 | -1.55 |
| 2026-08-08 | 27 | 25 | 2.1 | 20 | 19 | 0.2 |
| 2026-08-09 | 32 | 25 | 7.33 | 23 | 19 | 3.89 |
| 2026-08-10 | 30 | 25 | 5.3 | 23 | 19 | 3.71 |
| 2026-08-11 | 25 | 24 | 0.17 | 19 | 19 | -0.14 |
| 2026-08-12 | 28 | 24 | 3.46 | 19 | 19 | 0.52 |
| 2026-08-13 | 31 | 24 | 6.49 | 22 | 19 | 3.23 |
| 2026-08-14 | 34 | 24 | 9.7 | 24 | 19 | 5.8 |
Top-10 Tage mit größter Abweichung zum Referenzwert
Die zehn Tage mit der größten positiven Abweichung vom langjährigen Mittel (Tagesmittel):
sommer_2026_tag |>
arrange(desc(TMK_abw)) |>
slice_head(n = 10) |>
transmute(Datum, TMK, TMK_ref, TMK_abw) |>
tt() |>
format_tt(digits = 1)| Datum | TMK | TMK_ref | TMK_abw |
|---|---|---|---|
| 2026-06-27 | 30 | 18 | 12 |
| 2026-06-28 | 28 | 18 | 10 |
| 2026-06-26 | 28 | 17 | 10 |
| 2026-06-25 | 26 | 17 | 9 |
| 2026-06-19 | 25 | 17 | 9 |
| 2026-06-20 | 25 | 17 | 8 |
| 2026-06-24 | 25 | 17 | 8 |
| 2026-06-18 | 23 | 17 | 7 |
| 2026-06-21 | 24 | 17 | 7 |
| 2026-06-22 | 23 | 17 | 6 |
Fazit
Sowohl die langfristige Monatsreihe der Bundesland-Gebietsmittel als auch die selbst gebildeten Tagesmittel aus Stationsdaten zeigen für den Sommer 2026 ein deutlich überdurchschnittliches Bild: Die Sommertemperatur bewegt sich auf dem Niveau der bisherigen Rekordsommer, und schon bis Mitte August wurden mehr als doppelt so viele Hitzetage und eine längere Hitzewelle registriert als im gesamten Sommer 2025.