Python und das Klima

Es ist in aller Munde und das zu Recht. Flüsse trocknen aus, Wälder brennen und die Temperaturen erreichen Rekordwerte. Dieser Umstand hat mich dazu veranlasst mal auf die Suche zu gehen. Da gibt es doch bestimmt was im Netz in Verbindung mit Python. Und siehe da, ich habe eine schöne Seite gefunden, die genau das bietet. Eine Wetterdatenbank die man sehr schön in Python einbinden kann. Ich habe mir den Beispielcode der Seite geschnappt und ein wenig erweitert, bzw. angepasst. Prinzipiell kann man verschiedene Zeiträume eingeben und sich diese als Diagramm ausgeben lassen. Da der meteorologische Sommer ja nun vorbei ist, habe diesen mit dem vom letzten Jahr 2021 verglichen. Außerdem habe ich noch ein kleines GUI gebastelt und die ganzen Plotfunktionen in ein eigenes Modul verlegt. So kann man aus dem Hautprogramm auf die Funktionen im Einzelnen zugreifen. Vielen Dank an den Entwickler von meteostat.net, dort gibt es noch viel mehr zu sehen. Wer sich für das Thema interessiert, sollte dort mal vorbei schauen. Das Meteostat Python Package nennt sich meteostat und kann ganz normal mit pip installiert werden. Der Code ist einfach nur eine Übung für mich, die ein sinnvolles Ergebnis liefert. Ich übe noch und es gibt sicherlich eine vielzahl von Verbesserungen, die man an dem Code vornehmen kann.

Die Hauptdatei:

from tkinter import *
from tkinter import ttk
from datetime import datetime
from meteostat import Stations, Daily
from graph import *

def meteodata():
    #Koordinaten Bremen (Station1)
    lat1 = 53.07516
    lon1 = 8.80777

    #Koordinaten Bremen (Vergleichsstation)
    lat2 = 53.07516
    lon2 = 8.80777

    # Zeitraum Station1
    start1 = datetime(2022,6,1)
    end1 = datetime(2022,8,31)

    # Zeitraum Station2
    start2 = datetime(2021,6,1)
    end2 = datetime(2021,8,31)

    # Station am nähesten zu Koordinaten (Station1) suchen
    stations1 = Stations()
    stations1 = stations1.nearby(lat1, lon1)
    stations1 = stations1.inventory('daily', (start1, end1))
    station1 = stations1.fetch(1)

    # Station am nähesten zu Koordinaten (Station2) suchen
    stations2 = Stations()
    stations2 = stations2.nearby(lat2, lon2)
    stations2 = stations2.inventory('daily', (start2, end2))
    station2 = stations2.fetch(1)

    # Tägliche Daten für die Station 1 holen
    data1 = Daily(station1, start1, end1)
    data1 = data1.fetch()
    
    # Tägliche Daten für die Station 2 holen
    data2 = Daily(station2, start2, end2)
    data2 = data2.fetch()
    
    #Abfrage des Auswahlmenues und aufrufen der entsprechenden Funktion
    if Combo.get() == "Niederschlag":
        rain(data1,data2)
    elif Combo.get() == "Sonnenstunden":
        sun(data1, data2)
    elif Combo.get() == "Schneehoehe":
        snow(data1, data2)
    elif Combo.get() == "Max. Temperatur":
        tmax(data1, data2)
    elif Combo.get() == "Min. Temperatur":
        tmin(data1, data2)
    elif Combo.get() == "Durchschnittstemperatur":
        tavg(data1, data2)
    elif Combo.get() == "Temperaturen zusammen":
        temp_all(data1, data2)

# GUI
root = Tk()
root.geometry("300x300")
root.resizable(width=0, height=0)

backFrame = Frame(master=root, width=300, height=300)
backFrame.place(x=0,y=0)

label1 = Label(root, text="Datenvergleich\nSommer 2022 / 2021", font=("Arial", 22))
label1.pack(pady=10)

vlist = ["Niederschlag", "Sonnenstunden", "Max. Temperatur", "Min. Temperatur", "Durchschnittstemperatur", "Temperaturen zusammen"]
Combo = ttk.Combobox(root, values = vlist, state="readonly")
Combo.set("Diagramm auswaehlen")
Combo.place(x=45, y=90)

button = Button(root, text="Anzeigen", command = meteodata)
button.place(x=45, y=150)

button1 = Button(root, text="Beenden", command = root.destroy)
button1.place(x=160, y=150)

label2 = Label(root, text="Datenquelle: meteostat.net", font=("Arial", 12))
label2.place(x=10, y= 275)

root.title("Datenabfrage")
root.mainloop()

Der Code für die Datei mit den Funktionen (graph.py):

import matplotlib.pyplot as plt
    
def rain(data1, data2):
    summe1 = data1["prcp"].sum() # Summiert die angegebe Spalte
    summe1 = round(summe1)
    summe2 = data2["prcp"].sum() # Summiert die angegebe Spalte
    summe2 = round(summe2)
    #print(summe1, summe2) #Kontrolle
    plt.style.use('bmh') #Style fuer Gesamt
    plt.figure("Klimadatenvergleich") # Fenster Name
    plt.subplot(211)
    plt.plot(data1['prcp'], label=(f"Niederschlag\n(Ges.: {summe1})"))
    plt.ylabel("[l/qm]")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen | Sommer 2022", fontsize=12) #Diagramm Titel 1
    plt.legend()
    plt.subplot(212)
    plt.plot(data2['prcp'], label=(f"Niederschlag\n(Ges.: {summe2})"))
    plt.ylabel("[l/qm]")
    plt.xticks(rotation=0, fontsize=8)
    plt.legend()
    plt.title("Bremen | Sommer 2021", fontsize=12) #Diagramm Titel 2
    plt.show()

def sun(data1, data2):
    summe1 = data1["tsun"].sum()/60 # Summiert die angegebe Spalte
    summe1 = round(summe1)
    summe2 = data2["tsun"].sum()/60 # Summiert die angegebe Spalte
    summe2 = round(summe2)
    #print(summe1, summe2) #Kontrolle
    plt.style.use('bmh') #Style fuer Gesamt
    plt.figure("Klimadatenvergleich") # Fenster Name
    plt.subplot(211)
    plt.plot(data1['tsun'], color= "orange", label=(f"Sonnenstunden\n(Ges.: {summe1})"))
    plt.ylabel("Minuten")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen | Sommer 2022", fontsize=12) #Diagramm Titel 1
    plt.legend()
    plt.subplot(212)
    plt.plot(data2['tsun'], color= "orange", label=(f"Sonnenstunden\n(Ges.: {summe2})"))
    plt.ylabel("Minuten")
    plt.xticks(rotation=0, fontsize=8)
    plt.legend()
    plt.title("Bremen | Sommer 2021", fontsize=12) #Diagramm Titel 2
    plt.show()


def snow(data1, data2):
    summe1 = data1["snow"].sum()/100 # Summiert die angegebe Spalte
    summe1 = round(summe1)
    summe2 = data2["snow"].sum()/100 # Summiert die angegebe Spalte
    summe2 = round(summe2)
    print(summe1, summe2) #Kontrolle
    plt.style.use('bmh') #Style fuer Gesamt
    plt.figure("Klimadatenvergleich") # Fenster Name
    plt.subplot(211)
    plt.plot(data1['snow'], color= "white", label=(f"Schneehöhe\n(Ges.[m]: {summe1})"))
    plt.ylabel("Millimeter")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen") #Diagramm Titel
    plt.legend()
    plt.subplot(212)
    plt.plot(data2['snow'], color= "white", label=(f"Schneehöhe\n(Ges.[m]: {summe2})"))
    plt.ylabel("Millimeter")
    plt.xticks(rotation=0, fontsize=8)
    plt.legend()
    plt.show()

def tmax(data1, data2):
    plt.style.use('bmh') #Style fuer Gesamt
    plt.figure("Klimadatenvergleich") # Fenster Name
    plt.subplot(211)
    plt.plot(data1['tmax'], color= "red", label="Tmax.")
    plt.ylabel("Temeratur [°C]")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen | Sommer 2022", fontsize=12) #Diagramm Titel 1
    plt.legend()
    plt.subplot(212)
    plt.plot(data2['tmax'], color= "red", label="Tmax.")
    plt.ylabel("Temperatur [°C]")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen | Sommer 2021", fontsize=12) #Diagramm Titel 2
    plt.legend()
    plt.show()

def tmin(data1, data2):
    plt.style.use('bmh') #Style fuer Gesamt
    plt.figure("Klimadatenvergleich") # Fenster Name
    plt.subplot(211)
    plt.plot(data1['tmin'], color= "blue", label="Tmin.")
    plt.ylabel("Temeratur [°C]")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen | Sommer 2022", fontsize=12) #Diagramm Titel 1
    plt.legend()
    plt.subplot(212)
    plt.plot(data2['tmin'], color= "blue", label="Tmin.")
    plt.ylabel("Temperatur [°C]")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen | Sommer 2021", fontsize=12) #Diagramm Titel 2
    plt.legend()
    plt.show()

def tavg(data1, data2):
    plt.style.use('bmh') #Style fuer Gesamt
    plt.figure("Klimadatenvergleich") # Fenster Name
    plt.subplot(211)
    plt.plot(data1['tavg'], color= "green", label="Tavg.")
    plt.ylabel("Temeratur [°C]")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen | Sommer 2022", fontsize=12) #Diagramm Titel 1
    plt.legend()
    plt.subplot(212)
    plt.plot(data2['tavg'], color= "green", label="Tavg.")
    plt.ylabel("Temperatur [°C]")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen | Sommer 2021", fontsize=12) #Diagramm Titel 2
    plt.legend()
    plt.show()

def temp_all(data1, data2):
    plt.style.use('bmh') #Style fuer Gesamt
    plt.figure("Klimadatenvergleich") # Fenster Name
    plt.subplot(211)
    plt.plot(data1['tmax'], color= "red", label="Tmax.")
    plt.plot(data1['tavg'], color= "green", label="Tavg.")
    plt.plot(data1['tmin'], color= "blue", label="Tmin.")
    plt.ylabel("Temeratur [°C]")
    plt.xticks(rotation=0, fontsize=8)
    plt.title("Bremen | Sommer 2022", fontsize=12) #Diagramm Titel 1
    plt.legend()
    plt.subplot(212)
    plt.plot(data2['tmax'], color= "red", label="Tmax.")
    plt.plot(data2['tavg'], color= "green", label="Tavg.")
    plt.plot(data2['tmin'], color= "blue", label="Tmin.")
    plt.ylabel("Temperatur [°C]")
    plt.xticks(rotation=0, fontsize=8)
    plt.legend()
    plt.title("Bremen | Sommer 2021", fontsize=12) #Diagramm Titel 2
    plt.show()

So sieht das kleine GUI aus. Hier kann man die verschiedenen Diagramme auswählen.


Und so sehen dann z.B. die generierten Diagramme aus:

Niederschlag 2022 vs. 2021 (01.06 – 31.08) / Datenquelle: meteostat.net

Sonnenstunden 2022 vs. 2021 (01.06 – 31.08) / Datenquelle: meteostat.net

Temperaturen 2022 vs. 2021 (01.06-31.08) / Datenquelle: meteostat.net