NUR FÜR PYTHON Energiebilanzierung an Standorten des ICOS-Netzwerks
Übersicht
ICOS steht für “Integrated Carbon Observation System” und umfasst mehr als 170 Messstationen in Europa. In diesem Projekt konzentrieren wir uns auf die sogenannten “Ecosystem Observations”. An den betreffenden Stationen werden insbesondere vertikale Flüsse von Energie, Wasser und Kohlendioxid mittels so genannter Eddy-Flux-Türme erfasst. Ziel dieser Aufgabe ist die Darstellung charakteristischer Tages- und Jahresgänge der Energieebilanz (Strahlung, latente und fühlbare Wärmeflüsse) sowie die Ermittlung des Bowen-Ratios. Ferner soll das Stationsmessnetz mit einer Karte der Klimazonen nach Koeppen abgeglichen werden.
Daten
icos/FLUXES: enthält für jeden ICOS Standort des Kollektivs “Ecosystem Observations” eine zip-Datei, die nach dem Land und dem Standortkürzel benannt ist. So enthält z.B. die DateiICOSETC_BE-Bra_FLUXES_L2.zipdie Daten für den Standort “Brasschaat” (Bra) in Belgien (BE). Jede dieser zip-Dateien enthält wiederum nur eine einzige csv-Datei mit den Eddy-Flux-Messdaten an der jeweiligen Station. Die Variablen sind inicos/Fluxes_Variables.csvbeschrieben.icos/METEO: genauso wieicos/FLUXES, aber mit meteorologischen Messdaten. Die Variablen sind inicos/Meteo_Variables.csvbeschrieben.icos/stations.csv: Enthält Metadaten der ICOS-Messstationen.koeppen/koppen_geiger_0p00833333.tif: Rasterdatensatz der Klimazonen nach Koeppen-Geiger für die Klimanormale 1991-2020. Jede Integer einer Gitterzelle kodiert eine Klimazone (siehelegend.txt).koeppen/legend.txt: Legende für den Koeppen-Datensatz. Ordnet den Integern aus dem Koeppen-Gitter die Klimazone zu (Hauptklimate und Unterklimate).shapefiles/europe_countries.shp: Shapefile mit den europäischen Ländern (für die Visualisierung).
Zu erzielende Ergebnisse / Arbeitsschritte
- Ermittle aus der Tabelle
stations.csvzunächst für jede Station eine ID, die sich aus Länder- und Stationskürzel zusammensetzt. Das wäre z.B. “BE-Bra” für obiges Beispiel. Dazu musst Du die SpalteIdverarbeiten und mit Stringoperationen die eigentliche ID extrahieren. Ferner sollst Du aus der SpaltePositionden Längen- und Breitengrad jeweils alsfloatisolieren. Erstelle dann einen DataFrame mit folgenden Spalten:Name,Country,Lon,Lat,Site type,Elevation_above_seaundLabeling date. Der Zeilenindex soll der Stations-ID entsprechen, den Du selbst gebastelt hast. Mit diesem DataFrame (wie nennen in einfach malstations) arbeitest Du in der Folge weiter. - Lies die Datei
koeppen/koppen_geiger_0p00833333.tifsowie die zugehörige Legende (koeppen/legend.txt) ein. Ermittele für jeden Standort die zugehörige Gitterzelle und ordne auf diese Weise jedem Standort die Koeppen-Klimazone zu. Füge diese Information als zusätzliche SpaltekoeppenDeinemstations-DataFrame hinzu. - Schreibe nun eine Funktion, die für eine beliebige
FLUXES-Datei eines Standorts dieFLUXESals DataFrame extrahiert und zurückgibt. Aus der DateiICOSETC_BE-Bra_FLUXES_L2.zipmüsste alsoICOSETC_BE-Bra_FLUXES_L2.csvin einen DataFrame gelesen werden. Du sollst aber nicht alle Variablen (Spalten) zurückgeben, sondern nur “TIMESTAMP_START”, “TIMESTAMP_END”, “H” und “LE”. Sollte ein Standort hingegen nicht alle diese Variablen enthalten oder es gar keine Datei dafür geben, dann gib None zurück. Die Bedeutung der Variablen steht in der DateiFluxes_Variables.csv, die in jedem Archiv enthalten ist. Füge in das Notebook eine kurze Erläuterung der Variablen und ihrer Einheiten hinzu. - Wende nun Deine Funktion auf alle Standorte aus
stationsan. Speichere die jeweiligen DataFrames so ab, dass Du über ihre ID zugreifen kannst (in Python z.B. in einem dictionary, in R z.B. in einer Liste). Füge dem DataFramestationseine weitere Spalte “hasfluxes” hinzu und setze für eine Station den Wert aufFalse, wenn die FunktionNonezurückgibt. - Gehe nun genauso für das Auslesen von Daten aus dem Verzeichnis
METEOvor. Hier sollst Du nur folgende Variablen auslesen: “LW_IN”, “LW_OUT”, “SW_IN” und “SW_OUT”. Die Variablen sind inFluxes_Variables.csvbeschrieben. - Berechne nun das mittlere Bowen-Ratio für jede Station und füge den Wert dem DataFrame
stationsals Spaltebowenhinzu. Was ist das Problem in Bezug auf die Vergleichbarkeit der Werte für die unterschiedlichen Stationen? - Erstelle eine Karte Europas, in welcher Du den Wert von
bowenfür jede Station farblich kodierst (mit horizontalem Colorbar als Legende). Nutze die Koeppen-Klimazonen als Hintergrund und stelle in einem vertikalen Colorbar eine Legende für die Koeppen-Zonen dar. - Schreibe eine Funktion, welche für eine beliebige Station eine zweispaltige Abbildung erstellt:
- linke Spalte: mittlere Tagesgänge (stündliche Mittelwerte) des fühlbaren und latenten Wärmeflusses sowie der Nettostrahlung für Januar und Juli
- rechte Spalte: mittlere Jahresgänge (monatliche Mittelwerte) des fühlbaren (H) und latenten Wärmeflusses (LE) sowie der Nettostrahlung. Stelle auch die Summe der Kurven für H und LE dar und vergleiche diese mit der Nettostrahlung. Was fällt auf?
- Welche Flussgröße der Energieebilanz an der Erdoberfäche ist in dieser Betrachtung noch nicht enthalten?
- Erweitere Deine Funktion so, dass für eine Liste von
nStations-IDs eine Abbildung mit zwei Spalten undnZeilen erstellt wird (eine Zeile pro Station). Erstelle auf dieser Grundlage eine Abbildung mit fünf Stationen aus unterschiedlichen Klimazonen. Verzeichne in den Zeilen jeweils auch die StandortattributeSite typesowie die Klimazone nach Köppen.
Hinweise
Python
Wie liest man eine Datei aus einem zip-Archiv in einen DataFrame ein?
import zipfile
zippath = "foo/bar.zip"
whichfile = "myfile.csv"
with zipfile.ZipFile(zippath, 'r') as z:
if not whichfile in z.namelist():
print("File %s no found in archive %s. Only found:" % (myfile, zippath))
for fname in z.namelist():
print(fname)
else:
with z.open(whichfile) as f:
df = pd.read_csv(f, ...)