NUR FÜR PYTHON Kohlenstoffbilanzierung 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 von Kohlenstoffflüssen und der CO~2~-Konzentration auf unterschiedlichen Zeitskalen. 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. - 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”, “CO2”, “LE” und “NEE”. Sollte ein Standort hingegen nicht alle diese Variablen enthalten oder es gar keine Datei dafür geben, dann gibNonezurü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). 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. - Füge dem DataFrame
stationseine neue Spalte namenststarthinzu, welche den Zeitstempel mit der ersten gültigen Messung an dieser Station enthält. - Berechne für jede Station den Anteil fehlender Daten (NaN) für die Variable
NEEfür den Zeitraum nach tstart. Speichere das Ergebnis instationsin der SpaltemissingNEE. - Interpoliere für jede Station die Variable
NEEmit.interpolateund füge das Ergebnis in einer neuen SpalteNEEipdem DataFrame hinzu. - Berechne für jede Station, an der
missingNEE< 0.5 ist, die Netto-CO~2~-Emission (oder Sequestrierung) im Zeitraum “2021-01-01” bis “2024-12-31” (Summe überNEEip). Füge den Wert dem DataFramestationsals SpaltenetNEEhinzu (für alle anderen Stationen setzenetNEEaufnumpy.nan). - Erstelle eine Karte Europas, in welcher Du den Wert von
netNEEfür jede Station farblich kodierst (mit horizontalem Colorbar als Legende). Stelle zur räumlichen Verortung das Shapefile mit den europäischen Ländern mit dar. Inwiefern sticht die Station “SE-Nor” hervor? Versuche zu recherchieren, was ist dort passiert ist. Zeige eine Zeitreihe vonNEEfür diese Station. - Schreibe eine Funktion, welche für eine beliebige Station eine zweispaltige Abbildung erstellt:
- linke Spalte: mittlere Tagesgänge (stündliche Mittelwerte) von
NEEipsowie der kurzwelligen EinstrahlungSW_INfür Januar und Juli - mittlere Spalte: mittlere Jahresgänge (monatliche Mittelwerte) der gleichen Variablen
- rechte Spalte: Zeitreihe der CO2-Konzentration (Tagesmittelwerte)
- linke Spalte: mittlere Tagesgänge (stündliche Mittelwerte) von
- Erweitere Deine Funktion so, dass für eine Liste von
nStations-IDs eine Abbildung mit drei Spalten undnZeilen erstellt wird (eine Zeile pro Station). Erstelle auf dieser Grundlage eine Abbildung mit fünf Stationen aus unterschiedlichen Klimazonen und/oder Ökosystemtypen. Nutze möglichst lange Zeitreihen. 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, ...)