NUR FÜR PYTHON Wasseräquivalent in der Schneedecke von 1950 bis heute - Vergleich von ERA5-Land und Beobachtungen des DWD
Übersicht
ERA5 ist eine der weltweit bedeutendsten Reanalysen des Klimasystems. Eine Reanalyse kombiniert Modell und Beobachtungen, um so eine möglichst konsistente Rekonstruktion unterschiedlicher Variablen in Atmosphäre, Landoberfläche und Ozeanen zu erstellen. ERA5-Land fokussiert dabei auf die Landoberfläche und erreicht dabei eine räumliche Auflösung von etwa neun Kilometern.
Auch wenn das Ziel einer Reanalyse die konsistente Abbildung von Beobachtung und Physik anstrebt, bedeutet dies nicht, dass die Reanalyse alle Beobachtungen zuverlässig reproduziert. Dies ist aus einer Vielzahl von Gründen auch gar nicht das Ziel bzw. auch gar nicht möglich. Umso wichtiger ist es, sich für die jeweils betrachtete Klimavariable einer Region ein Bild über die Unsicherheit der Reanalyse zu verschaffen.
Im vorliegenden Projekt setzt Du Dich mit der ERA5-Land Rekonstruktion des Wasseräquivalents der Schneedecke (engl. snow water equivalent, SWE, in mm) auseinander. Dabei sollst Du einerseits die langfristige Änderung des SWE gemäß ERA5-Land untersuchen. Andererseits sollst Du das SWE aus ERA5-Land mit Beobachtungen des Deutschen Wetterdienstes (DWD) vergleichen, um die Unsicherheit der Reanalyse zu quantifizieren.
Daten
era5-swe-airt.nc: NetCDF-Datei mit monatlichen Mittelwerten des SWE und der Lufttemperatur für Europa (1951 bis heute) auf Basis von ERA5-Land. Die Variablesdenthält das SWE in der Einheit m. Empfehlung: Umrechnung in mm.dwd/wa/Wa_Tageswerte_Beschreibung_Stationen.txt: Stationsübersicht des DWD für Messstationen aus dem WA-Kollektiv (für Wasseraequivalent). Enthält u.a. die Stations-ID sowie Standortkoordinaten und Stationshöhe.dwd/BESCHREIBUNG_WA.pdf: Beschreibung der eigentlichen Datendwd/wa/: In diesem Verzeichnis liegen die tägliche Messungen des DWD aus dem “WA”-Kollektiv (>1000 Stationen). Jede zip-Datei entspricht einem Stationsdatensatz (Namenschema:tageswerte_Wa_{ID}_{Startdatum}_{Enddatum}_hist.zip). Die Daten wurden vom Opendata-Repository des DWD heruntergeladen (Link) - siehe auch die oben beschriebenen DateienWa_Tageswerte_Beschreibung_Stationen.txt(Stationsübersicht) undBESCHREIBUNG_WA.pdf(Beschreibung der Daten). Innerhalb jeder zip-Datei ist jeweils vor allem die Dateiprodukt_waequi_tag_{...}.txtrelevant. Die Schwierigkeit mit diesem Datensatz: Messungen des SWE (SpalteWASH_6) sind nur ab einer Mindesthöhe der Schneedecke (typischweise 5 cm) sinnvoll durchführbar. Falls keine Messungen durchgeführt wurden, wird ein NoData-Wert angegeben. NoData kann in diesem Fall also zwei Dinge bedeuten: (a) Messungen wurden im Zeitraum grundsätzlich nicht durchgeführt; (b) Messungen wurden aufgrund zu geringmächtiger Schneedecke nicht durchgeführt. Dieser Sachverhalt erschwert die Abschätzung des mittleren SWE über längere Zeiträume (z.B. einen Monat). Um das obenstehende Problem zu beheben, sollt Ihr ferner die Beobachtungen der Schneehöhe (ParameterSH_TAG) berücksichtigen, welche durchgehend verfügbar sind. Weitere Hinweise unten.shapefiles/VG250_LAN.shp: Shapefile mit Bundesländergrenzen (zur Visualisierung).
Arbeitsschritte und zu erzielende Ergebnisse
- Lies die Datei
dwd/wa/Wa_Tageswerte_Beschreibung_Stationen.txtein und erzeuge daraus eine GeoDataFrame namenswalocs. Nutze die Stations-ID als Zeilenindex. - Schreibe eine Funktion, die für eine beliebige Station mit
IDdie entsprechenden Beobachtungen ausdwd/wa/in einen DataFrame einliest und diesen zurückgibt. - Wende nun die Funktion auf alle IDs in
walocsan. Speichere die DataFrames in einemdictnamenswadataab, in welchem Du die Stations-ID alskeynutzt. So kannst Du jederzeit darauf zugreifen. Achtung: Nicht für jede ID liegen Daten vor. Damit musst Du umgehen. Fügewalocseine Spalte namenshasdatahinzu und setze den Wert aufFalse, wenn keine Daten vorliegen (sonstTrue). Erzeuge dann einen neuen DataFrame (walocs2), der nur noch Einträge hat, für diehasdataTrueist. - “Trimme” die einzelnen DataFrames in
wadata. Das soll heißen: Entferne alle Zeilen vor dem ersten und nach dem letzten gültigen Wert vonWASH_6. - Berechne für jede Station eine vollständige Zeitreihe des SWE. Die Herausforderung dabei ist oben bereits beschrieben:
WASH_6(also der SWE) wird nur gemessen, wenn eine Mindesthöhe der Schneedecke erreicht ist. Die SchneehöheSH_TAGhingegen ist relativ lückenlos vorhanden. Dies kannst Du Dir zunutze machen: Berechne zunächst die Schneedichte (also Wasseräquivalent durch Höhe, nennen wir diese Variable einmaldensund fügen dafür eine neue Spalte hinzu).denskannst Du interpolieren, also mit Hilfe vonpandasdie Lücken füllen, die durch fehlende Werte vonWASH_6entstehen (df["ipdens"] = df[["dens"]].interpolate(method='nearest')). Indem Du nunipdensmitSH_TAGmultiplizierst, erhältst Du eine vollständige Reihe des SWE (neue Spalteswe). - Erstelle nun einen neuen DataFrame namens
wadaily, dessen Spalten dieswe-Reihen der einzelnen Stationen enthalten (Datum als Zeilenindex, Stations-IDs als Spaltenindex).wadailyführt also dieswe-Spalten aus den DataFrames zusammen, die im Dictionarywadataenthalten sind. - Erzeuge durch Mittelwertsbildung aus
wadailyeinen DataFrame auf monatlicher Auflösung (wamonthly). - Lies den ERA5-Land-Datensatz ein und extrahiere für jede Station aus
walocs2den SWE-Wert aus dem ERA5-Land-Datensatz). Speichere die Ergebnisse in einem DataFrameera5, in dem jede Station auswalocs2durch eine Spalte repräsentiert wird. Als Zeilenindex nutzt Du die monatlichen Zeitstempel aus dem NetCDF-Datensatz. - Ermittle nun für jede Station die folgenden Kenngrößen und füge die Ergebnisse
walocs2hinzu:- den mittleren prozentualen Fehler (mean percentage error, MPE) der monatlichen Mittelwerte aus ERA5-Land (aus dem Vergleich von
wamonthlyundera5). - Welcher Monat hat im Mittel den höchsten SWE-Wert (auf Basis von ERA5-Land)?
- SWE-Trend der ERA5-Land-Daten von 1950 bis 2024 für den Monat Februar. Nutze als Einheit für den Trend bitte mm/Dekade.
- den mittleren prozentualen Fehler (mean percentage error, MPE) der monatlichen Mittelwerte aus ERA5-Land (aus dem Vergleich von
- Stelle die drei obigen Werte als Histogramm und als Karte dar.
- Warum ist es sinnvoller, den Trend aus ERA5-Land zu berechnen als aus den Stationsmessungen?
Hinweise
Python
Datei aus zip-Archiv lesen
import zipfile
# zip_path ist der Pfad zum zip-Archiv einer Station
with zipfile.ZipFile(zip_path, 'r') as z:
# Erst ermitteln wir den Namen der Datei mit dem Datenprodukt
fname = ""
for f in z.namelist():
if "produkt" in f:
fname = f
# Dann lesen wir dies in einen DataFrame
with z.open(fname) as f:
weq = pd.read_csv(f, sep=";", na_values=-999.)
...
Zeitreihe für einen Standort aus einem NetCDF lesen (hier: NetCDF mit ERA5-Land-Daten)
import xarray as xr
ds = xr.open_dataset(".../era5-swe-airt.nc")
# lat und lon sind die Standortkoordinaten einer Station
# siehe dwd/wa/Wa_Tageswerte_Beschreibung_Stationen.txt
swe = (1e3*ds.sel(latitude=lat, longitude=lon, method="nearest")["sd"])
...