3.1. Urban-Heat-Island-Effekt Quantifizierung mittels Zeitreihenanalyse, Berlin#

author: Anna-Lena Thran und Mira Pruß

area: in Berlin (Dahlem) und Brandenburg (Angermünde)

date: 26.08.2024

3.1.1. Einleitung#

Die Auswirkungen des Klimawandel sind bereits heute in allen Regionen der Welt zu spüren. Wetter- und Klimaextreme wie langanhaltene Hitzeperioden führen zu negativen Auswirkungen, z.B. auf die Ernährungssicherheit, die Wasserversorgung oder die menschliche Gesundheit (Calvin et al 2023). Der Anteil der Bevölkerung, der in städtischen Gebieten lebt, ist in den letzten Jahrzehnten stetig gewachsen. Im Jahr 2020 lebte fast die Hälfte der Weltbevölkerung in Städten. Neben den Herausforderungen durch den Klimawandel ergeben sich also auch durch die Urbanisierung vielfältige wirtschaftliche, soziale und ökologische Herausforderungen (World Cities Report 2022).

Bei der Untersuchung der thermischen Verhältnisse in urbanen Gebieten lässt sich das Phänomen der städtischen Wärmeinsel feststellen (Urban Heat Island, kurz UHI). Die erhöhte Bebauungsdichte, eine größere thermische Masse der Baumaterialien, eine reduzierte Vegetationsbedeckung sowie veränderte Windströmungsmuster führen in städtischen Gebieten im Vergleich zu ländlichen Regionen zu höheren Temperaturen (Rizwan et al., Oke 1973, Wilby 2003). Die Gefahrenlage bei Hitzewellen ist demzufolge in Städten intensiviert.

Mithilfe von meteorologischen Daten des Deutschen Wetterdienstes (DWD) möchten wir herausfinden, ob der UHI-Effekt in der vergleichenden Betrachtung von Berlin als städtisches Gebiet und Angermünde (Brandenburg) als ländliches Gebiet zu beobachten ist. Hieraus ergeben sich folglich zwei Forschungsfragen:

  1. Inwieweit lässt sich der UHI-Effekt mithilfe von Temperaturdaten von 2023 an den Wetterstationen Berlin Dahlem und Angermünde erkennen?

  2. In welchen Monaten ist der UHI-Effekt besonders sichtbar?

3.1.2. Methode#

Für die Beantwortung der Forschungsfragen werden nachfolgend die nötigen Schritte der Datenverarbeitung und Analyse erläutert.

Wofür die nachfolgenden Paketinstallation genutzt werden:

  1. pandas: Strukturierung, Manipulation und Analyse der Daten

  2. matpilot: Möglichkeit zur interaktiven Anpassung der Datenvisualsierung

  3. seaborn: ansprechender Datenvisualierung (aufbauend auf matpilot)

#Importieren der Pakete
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#Nutzung der Standartvorgaben von Seaborn und Festlegung der Standart Tabellen/ Grafikgröße
sns.set(rc={'figure.figsize':(11, 4)})

3.1.2.1. Datenvorbereitung#

Der DWD liefert die Daten als Textdatei, für die Analyse benötigen wir die Datei im CSV Format.

3.1.2.1.1. Datenvorbereitung Dahlem#

#Dahlem Stations ID 403

#Textdatei in CSV-Datei umwandeln (einmalig)
#with open('C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230116_20240718_00403.txt', 'r') as file:
#inhalt = file.read()
    
#eingabedatei = 'C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230116_20240718_00403.txt'
#ausgabedatei = 'C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230116_20240718_00403.csv'

#df = pd.read_csv(eingabedatei, sep=',')
#df.to_csv(ausgabedatei, index=False)
#print(f'Die Datei wurde erfolgreich als {ausgabedatei} gespeichert.')

#Daten einlesen:
df = pd.read_csv('C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230113_20240715_00403.csv', sep = ';',skipinitialspace=True)

#Spalten löschen
df = df.drop(columns=['STATIONS_ID','QN_3','FX','FM','QN_4','RSK','RSKF','SDK','SHK_TAG','NM','VPM','PM','UPM','TXK','TNK','TGK','eor'])
             
#Spalten umbenennen
df.columns = ['Date','Temp_Mean']

#Datum als Index umformatieren
from datetime import datetime
df['Date'] = pd.to_datetime(df['Date'],format='%Y%m%d') 
df = df.set_index('Date')

#Daten nach Datum sortieren
df = df.sort_values(by=['Date'], ascending = True)
             
#Das Jahr 2023 extrahieren 13.01.2023 - 31.12.2023
Dahlem = df['2023-01-13':'2023-12-31']
             
#auf NAs kontrollieren
Dahlem.isnull().sum(), Dahlem
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Cell In[2], line 15
      1 #Dahlem Stations ID 403
      2 
      3 #Textdatei in CSV-Datei umwandeln (einmalig)
   (...)
     13 
     14 #Daten einlesen:
---> 15 df = pd.read_csv('C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230113_20240715_00403.csv', sep = ';',skipinitialspace=True)
     17 #Spalten löschen
     18 df = df.drop(columns=['STATIONS_ID','QN_3','FX','FM','QN_4','RSK','RSKF','SDK','SHK_TAG','NM','VPM','PM','UPM','TXK','TNK','TGK','eor'])

File /opt/anaconda3/envs/jupyter_book_ml/lib/python3.9/site-packages/pandas/io/parsers/readers.py:1026, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)
   1013 kwds_defaults = _refine_defaults_read(
   1014     dialect,
   1015     delimiter,
   (...)
   1022     dtype_backend=dtype_backend,
   1023 )
   1024 kwds.update(kwds_defaults)
-> 1026 return _read(filepath_or_buffer, kwds)

File /opt/anaconda3/envs/jupyter_book_ml/lib/python3.9/site-packages/pandas/io/parsers/readers.py:620, in _read(filepath_or_buffer, kwds)
    617 _validate_names(kwds.get("names", None))
    619 # Create the parser.
--> 620 parser = TextFileReader(filepath_or_buffer, **kwds)
    622 if chunksize or iterator:
    623     return parser

File /opt/anaconda3/envs/jupyter_book_ml/lib/python3.9/site-packages/pandas/io/parsers/readers.py:1620, in TextFileReader.__init__(self, f, engine, **kwds)
   1617     self.options["has_index_names"] = kwds["has_index_names"]
   1619 self.handles: IOHandles | None = None
-> 1620 self._engine = self._make_engine(f, self.engine)

File /opt/anaconda3/envs/jupyter_book_ml/lib/python3.9/site-packages/pandas/io/parsers/readers.py:1880, in TextFileReader._make_engine(self, f, engine)
   1878     if "b" not in mode:
   1879         mode += "b"
-> 1880 self.handles = get_handle(
   1881     f,
   1882     mode,
   1883     encoding=self.options.get("encoding", None),
   1884     compression=self.options.get("compression", None),
   1885     memory_map=self.options.get("memory_map", False),
   1886     is_text=is_text,
   1887     errors=self.options.get("encoding_errors", "strict"),
   1888     storage_options=self.options.get("storage_options", None),
   1889 )
   1890 assert self.handles is not None
   1891 f = self.handles.handle

File /opt/anaconda3/envs/jupyter_book_ml/lib/python3.9/site-packages/pandas/io/common.py:873, in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)
    868 elif isinstance(handle, str):
    869     # Check whether the filename is to be opened in binary mode.
    870     # Binary mode does not support 'encoding' and 'newline'.
    871     if ioargs.encoding and "b" not in ioargs.mode:
    872         # Encoding
--> 873         handle = open(
    874             handle,
    875             ioargs.mode,
    876             encoding=ioargs.encoding,
    877             errors=errors,
    878             newline="",
    879         )
    880     else:
    881         # Binary mode
    882         handle = open(handle, ioargs.mode)

FileNotFoundError: [Errno 2] No such file or directory: 'C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230113_20240715_00403.csv'

3.1.2.1.2. Erläuterung zur Auswahl des Temperaturparameters:#

Um die beiden Zeitreihen im Hinblick auf den UHI-Effekt zu untersuchen, wird im weiteren Verlauf nur die Durchschnittstemperatur verwendet. Diese ist im Vergleich zur Maximaltemperatur weniger anfällig für mikroskalige Parameter (direkte Umgebung mit oder ohne Vegetation, Bebauung, Windverhältnisse etc.), die die Aufnahme der Wetterstationen beeinflussen könnten, denn der UHI-Effekt findet klimatisch gesehen, auf der Mesoskala und nicht auf der Mikroskala statt (Oke et al. 2017).

3.1.2.1.3. Datenvorbereitung Angermünde#

#Angermünde Stations ID 164

#Textdatei in CSV-Datei umwandeln (einmalig)
#with open('C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230116_20240718_00164.txt', 'r') as file:
#inhalt = file.read()
    
#eingabedatei = 'C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230116_20240718_00164.txt'
#ausgabedatei = 'C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230116_20240718_00164.csv'

#df = pd.read_csv(eingabedatei, sep=',')
#df.to_csv(ausgabedatei, index=False)
#print(f'Die Datei wurde erfolgreich als {ausgabedatei} gespeichert.')

#Daten einlesen
df = pd.read_csv('C:/Users/anna-/OneDrive/Desktop/Studium/6. Semester/KI/Zeitreihenanalyse/Hausarbeit/produkt_klima_tag_20230113_20240715_00164.csv', sep = ';',skipinitialspace=True)

#Spalten löschen
df = df.drop(columns=['STATIONS_ID','QN_3','FX','FM','QN_4','RSK','RSKF','SDK','SHK_TAG','NM','VPM','PM','UPM','TXK','TNK','TGK','eor'])
             
#Spalten umbenennen
df.columns = ['Date','Temp_Mean']

#Datum als Index umformatieren
from datetime import datetime
df['Date'] = pd.to_datetime(df['Date'],format='%Y%m%d') 
df = df.set_index('Date')

#nach Datum sortieren
df = df.sort_values(by=['Date'], ascending = True)
             
#Das Jahr 2023 extrahieren 13.01.2023 - 31.12.2023
Angermünde = df['2023-01-13':'2023-12-31']
             
#auf NAs kontrollieren
Angermünde.isnull().sum(), Angermünde
(Temp_Mean    0
 dtype: int64,
             Temp_Mean
 Date                 
 2023-01-13        8.7
 2023-01-14        7.0
 2023-01-15        6.5
 2023-01-16        4.4
 2023-01-17        2.3
 ...               ...
 2023-12-27        3.4
 2023-12-28        7.9
 2023-12-29        8.6
 2023-12-30        5.9
 2023-12-31        5.0
 
 [353 rows x 1 columns])

3.1.3. 2.2. Visualisierung der Zeitreihen#

#Visualisierung der Daten in eine Grafik
Dahlem['Temp_Mean'].plot()
<Axes: xlabel='Date'>
../../../_images/87ae04cddc18682530fbbe4fccddedb1cf03465978f009faacfd5dec3e1bdfb8.png
# Gemeinsame Darstellung der beiden Zeitreihen und Steigerung der Grafikinformationen
# Erstellen eines neuen Plots mit der Festlegung der Größe der Grafik
plt.figure(figsize=(10, 5))

# Plotten der ersten Zeitreihe (Dahlem)
plt.plot(Dahlem.index, Dahlem['Temp_Mean'], label='Dahlem')

# Plotten der zweiten Zeitreihe (Angermünde)
plt.plot(Angermünde.index, Angermünde['Temp_Mean'], label='Angermünde')

# Hinzufügen von Titel und Achsenbeschriftungen
plt.title('Temperaturverlauf 2023 in Dahlem und Angermünde')
plt.xlabel('Monat')
plt.ylabel('Tagesmitteltemperatur (C°)')

# Hinzufügen einer Legende
plt.legend()

# Anzeigen des Plots
plt.show()
../../../_images/243d8304e6806cab1656444e13f8fa11fbd8a54111327e6d791538f9d2efe3b0.png
#Temperaturwerte auf die zweite Nachkommastelle runden 
Dahlem.describe().round(2), Angermünde.describe().round(2)
(       Temp_Mean
 count     353.00
 mean       11.30
 std         7.26
 min        -4.80
 25%         5.90
 50%        11.00
 75%        17.60
 max        25.30,
        Temp_Mean
 count     353.00
 mean       10.66
 std         7.37
 min        -7.70
 25%         5.00
 50%        10.30
 75%        17.30
 max        26.00)
#Weitere Visualiserungsoption in einem Boxplot-Diagramm
#Um das Datum in den Datensätzen Dahlem und Angermünde als Spalte benutzen zu können müssen diese umformatiert werden:
Dahlem_reset = Dahlem.reset_index()
Dahlem_reset
Angermünde_reset = Angermünde.reset_index()
Angermünde_reset
Date Temp_Mean
0 2023-01-13 8.7
1 2023-01-14 7.0
2 2023-01-15 6.5
3 2023-01-16 4.4
4 2023-01-17 2.3
... ... ...
348 2023-12-27 3.4
349 2023-12-28 7.9
350 2023-12-29 8.6
351 2023-12-30 5.9
352 2023-12-31 5.0

353 rows × 2 columns

#Extrahierung der Monatsnamen
Dahlem_reset['Month'] = Dahlem_reset['Date'].dt.strftime('%B')
Angermünde_reset['Month'] = Angermünde_reset['Date'].dt.strftime('%B')
#Visualisierung der Temperatur in Dahlem
plt.figure(figsize=(12, 6))
sns.boxplot(x='Month', y='Temp_Mean', data=Dahlem_reset)
plt.xticks(rotation=45)
plt.title('Boxplot der Durchschnittstemperatur für 12 Monate')
plt.show()
../../../_images/fc898146981101e9138d6f6edc979e1833dade9ec8dda7ba19e35587e75160a4.png
#Visualisierung der Temperatur in Dahlem
plt.figure(figsize=(12, 6))
sns.boxplot(x='Month', y='Temp_Mean', data=Angermünde_reset)
plt.xticks(rotation=45)
plt.title('Boxplot der Durchschnittstemperatur für 12 Monate')
plt.show()
../../../_images/b0889d5e25db0e65531850ff006373dad56483ce7f768b23c6fa065b8e37fb18.png

3.1.3.1. Berechnung und Visualsierung der Monats- und Wochenmitteltemperaturen#

3.1.3.1.1. Dahlem#

#Datensatz Monatsmittel erstellen 
data_columns = ['Temp_Mean']
Dahlem_Monatsmittel = Dahlem[data_columns].resample('M').mean()
Dahlem_Monatsmittel.head(12)
Temp_Mean
Date
2023-01-31 2.352632
2023-02-28 3.317857
2023-03-31 5.896774
2023-04-30 8.243333
2023-05-31 14.177419
2023-06-30 19.293333
2023-07-31 19.541935
2023-08-31 19.196774
2023-09-30 17.853333
2023-10-31 11.909677
2023-11-30 5.776667
2023-12-31 3.951613
#Erstellung eines Balkendiagramms der Monatsmitteltemperatur
Dahlem['Temp_Mean'].resample('M').mean().plot(kind='bar')
<Axes: xlabel='Date'>
../../../_images/a258d38c4070a68f19eccd2c10e952fab0c607c055b5489a1e7e0aad854aeb90.png
#Datensatz für Wochenmittel erstellen 
data_columns = ['Temp_Mean']
Dahlem_Wochenmittel = Dahlem[data_columns].resample('W').mean()
Dahlem_Wochenmittel.head(12)
Temp_Mean
Date
2023-01-15 7.533333
2023-01-22 1.257143
2023-01-29 0.757143
2023-02-05 2.928571
2023-02-12 0.757143
2023-02-19 5.671429
2023-02-26 4.928571
2023-03-05 1.271429
2023-03-12 1.485714
2023-03-19 8.057143
2023-03-26 10.442857
2023-04-02 6.685714
#Tasges- Wochen und Monatsmittel in einem Diagramm darstellen
start, end = '2023-01', '2023-12'

fig, ax = plt.subplots()
ax.plot(Dahlem.loc[start:end, 'Temp_Mean'],marker='.', linestyle='-', linewidth=0.5, label='Daily')
ax.plot(Dahlem_Wochenmittel.loc[start:end, 'Temp_Mean'],marker='o', markersize=4, linestyle='-', label='Weekly Mean Resample')
ax.plot(Dahlem_Monatsmittel.loc[start:end, 'Temp_Mean'],marker='o', markersize=8, linestyle='-', label='Monthly Mean Resample')
ax.set_ylabel('Temp_Mean')
ax.legend();
../../../_images/36a2c74a8c83594686fd6512df00ca5adaeb6cbf18f963da74a2e46ca99dd416.png

3.1.3.1.2. Angermünde#

#Datensatz für Monatsmittel erstellen 
data_columns = ['Temp_Mean']
Angermünde_Monatsmittel = Angermünde[data_columns].resample('M').mean()
Angermünde_Monatsmittel.head(12)
Temp_Mean
Date
2023-01-31 1.789474
2023-02-28 2.439286
2023-03-31 5.074194
2023-04-30 7.466667
2023-05-31 13.193548
2023-06-30 18.213333
2023-07-31 19.193548
2023-08-31 18.816129
2023-09-30 18.036667
2023-10-31 11.254839
2023-11-30 5.250000
2023-12-31 3.190323
#Datensatz im Balkendiagramm anzeigen  
Angermünde['Temp_Mean'].resample('M').mean().plot(kind='bar')
<Axes: xlabel='Date'>
../../../_images/03343794612291870dd83fc41f1037809b6566fd6ac4d3417d58bb842230df0f.png
#Datensatz für Wochenmittel erstellen 
data_columns = ['Temp_Mean']
Angermünde_Wochenmittel = Angermünde[data_columns].resample('W').mean()
Angermünde_Wochenmittel.head(12)
Temp_Mean
Date
2023-01-15 7.400000
2023-01-22 0.528571
2023-01-29 0.128571
2023-02-05 2.128571
2023-02-12 0.800000
2023-02-19 4.057143
2023-02-26 3.928571
2023-03-05 0.357143
2023-03-12 0.700000
2023-03-19 7.357143
2023-03-26 9.614286
2023-04-02 5.614286
# Tages-, Wochen und Monatsmittel in einem Diagramm darstellen
start, end = '2023-01', '2023-12'

fig, ax = plt.subplots()
ax.plot(Angermünde.loc[start:end, 'Temp_Mean'],marker='.', linestyle='-', linewidth=0.5, label='Daily')
ax.plot(Angermünde_Wochenmittel.loc[start:end, 'Temp_Mean'],marker='o', markersize=4, linestyle='-', label='Weekly Mean Resample')
ax.plot(Angermünde_Monatsmittel.loc[start:end, 'Temp_Mean'],marker='o', markersize=8, linestyle='-', label='Monthly Mean Resample')
ax.set_ylabel('Temp_Mean')
ax.legend();
../../../_images/528c97ba6e8213cd069ceb3789fddc9e6a718917502dbce6ebd72b418f0116de.png

3.1.3.2. Vergleich der Monatsmittel von Dahlem und Angermünde#

#Datensatz für beide Standorte gemeinsam erstellen
Monatsmittel = pd.concat([Dahlem_Monatsmittel, Angermünde_Monatsmittel], axis=1)
Monatsmittel.columns = ['Dahlem_Monatsmittel', 'Angermünde_Monatsmittel']
print(Monatsmittel)
            Dahlem_Monatsmittel  Angermünde_Monatsmittel
Date                                                    
2023-01-31             2.352632                 1.789474
2023-02-28             3.317857                 2.439286
2023-03-31             5.896774                 5.074194
2023-04-30             8.243333                 7.466667
2023-05-31            14.177419                13.193548
2023-06-30            19.293333                18.213333
2023-07-31            19.541935                19.193548
2023-08-31            19.196774                18.816129
2023-09-30            17.853333                18.036667
2023-10-31            11.909677                11.254839
2023-11-30             5.776667                 5.250000
2023-12-31             3.951613                 3.190323

Nach einer ersten visuelle Analyse fallen die Differenzen der Temperaturen auf. Für eine vereinfachte Auswertung wird nachfolgend eine Spalte hinzugefügt, die die Temperaturdifferenz direkt anzeigt.

#Datensatz erstellen der auch die Temperaturdifferenzen anzeigt
Monatsmittel['Temp_Diff'] = Monatsmittel['Dahlem_Monatsmittel'] - Monatsmittel['Angermünde_Monatsmittel']
Monatsmittel

Monatsmittel = Monatsmittel.round(2)
Monatsmittel
Dahlem_Monatsmittel Angermünde_Monatsmittel Temp_Diff
Date
2023-01-31 2.35 1.79 0.56
2023-02-28 3.32 2.44 0.88
2023-03-31 5.90 5.07 0.82
2023-04-30 8.24 7.47 0.78
2023-05-31 14.18 13.19 0.98
2023-06-30 19.29 18.21 1.08
2023-07-31 19.54 19.19 0.35
2023-08-31 19.20 18.82 0.38
2023-09-30 17.85 18.04 -0.18
2023-10-31 11.91 11.25 0.65
2023-11-30 5.78 5.25 0.53
2023-12-31 3.95 3.19 0.76

Die neu erzeugte Spalte zeigt, dass die durchschnittliche Luftemperatur in Dahlem in jedem Monat höher und lediglich in einem Monat niedriger ist.

Für die erweiterte Analyse, welche Monate die stärksten und welche die geringsten Temperaturunterschiede aufweisen kann mithilfe des folgenden Codes gearbeitet werden:

#Anzeige maximale Temperaturdifferenz
max_diff_index = Monatsmittel['Temp_Diff'].idxmax()
max_diff_index
Timestamp('2023-06-30 00:00:00')
#Anzeige minimale Temperaturdifferenz
min_diff_index = Monatsmittel['Temp_Diff'].idxmin()
min_diff_index
Timestamp('2023-09-30 00:00:00')

Erste Auswertung: Im Juni sind die Unterschiede der monatlichen Durchschnittstemperatur am stärksten, im September am geringsten.

#zwei Datensätze für Juni und September erstellen um maximale und minimale Temperaturunterschiede genauer zu untersuchen
Angermünde_Juni = Angermünde['2023-05-31':'2023-06-30']
Dahlem_Juni = Dahlem['2023-05-31':'2023-06-30']
Angermünde_September = Angermünde['2023-08-31':'2023-09-30']
Dahlem_September = Dahlem['2023-08-31':'2023-09-30']

#die Unterschiede der maximalen und minimalen Temperaturunterschiede in einem Boxplot darstellen
#Einstellung der Abbildungsgröße
plt.figure(figsize=(12, 6))

#Boxplot für den Monat mit dem maximalen Temperaturunterschied
plt.subplot(1, 2, 1)
plt.boxplot([Dahlem_Juni['Temp_Mean'], Angermünde_Juni['Temp_Mean']], labels=['Dahlem', 'Angermünde'])
plt.ylabel('Lufttemperatur (C°)')
plt.title(f'Temperaturverteilung im Juni')

#Boxplot für den Monat mit dem minimalen Temperaturunterschied
plt.subplot(1, 2, 2)
plt.boxplot([Dahlem_September['Temp_Mean'], Angermünde_September['Temp_Mean']], labels=['Dahlem', 'Angermünde'])
plt.ylabel('Lufttemperatur (C°)')
plt.title(f'Temperaturverteilung im September')

plt.tight_layout()
plt.show()
../../../_images/f68d656297d5ac237bf4d34313e1cea03aeda7bf975d67ae93b454855334933e.png

Der maximale Temperaturunterschied zwischen Dahlem und Angermünde findet im Juni 2023 statt, der minimalste Temperaturunterschied hingegen im September 2023.

#Monatsmittel im Kurvendiagramm vergleichen
start, end = '2023-01', '2023-12'

fig, ax = plt.subplots()
ax.plot(Dahlem_Monatsmittel.loc[start:end, 'Temp_Mean'],marker='o', markersize=8, linestyle='-', label='Dahlem')
ax.plot(Angermünde_Monatsmittel.loc[start:end, 'Temp_Mean'],marker='o', markersize=8, linestyle='-', label='Angermünde')
ax.set_ylabel('Temp_Mean')
plt.title('Monatsmittel-Temperaturverlauf 2023')
plt.ylabel('Lufttemperatur (C°)')
ax.legend();
../../../_images/8af05dcd819e4ec77474eac079fbd18b5362bd1dfc7ac596465607224f24ed4a.png

3.1.3.3. Visualisierung der Diffenz des Temperaturunterschiedes von Dahlem und Angermünde#

# Zusammefügen der Datensätze Dahlem & Angermünde
Differenz = pd.merge(Dahlem, Angermünde, left_index=True, right_index=True, how='inner')
# Umbenennung der Spalten 
Differenz.columns = ['Temp_Dahlem','Temp_Angermünde']
# Berechnung der täglichen Differenzen 
Differenz['Temp_Diff'] = Differenz['Temp_Dahlem'] - Differenz['Temp_Angermünde']
Differenz
Temp_Dahlem Temp_Angermünde Temp_Diff
Date
2023-01-13 9.0 8.7 0.3
2023-01-14 7.3 7.0 0.3
2023-01-15 6.3 6.5 -0.2
2023-01-16 4.7 4.4 0.3
2023-01-17 2.5 2.3 0.2
... ... ... ...
2023-12-27 4.0 3.4 0.6
2023-12-28 8.4 7.9 0.5
2023-12-29 9.5 8.6 0.9
2023-12-30 6.1 5.9 0.2
2023-12-31 5.9 5.0 0.9

353 rows × 3 columns

# Plotten der täglichen Temperaturdifferenz in einer Zeitreihe
plt.plot(Differenz.index, Differenz['Temp_Diff'], label='Tägliche Differenz')
plt.title('Tägliche Temperaturdifferenz zwischen Dahlem und Angermünde 2023')
plt.xlabel('Datum')
plt.ylabel('Temperaturdifferenz (°C)')
plt.axhline(y=0, color='gray', linestyle='--')
plt.legend()
plt.show()
../../../_images/66cb43c87e6a3aeff3b16d4cea6632f8aadaefc772be608041fa92a6be41ebde.png

3.1.4. Schlussfolgerung#

Mithilfe der Zeitreihenanalyse konnten die Foschungsfragen dieser Arbeit beantwortet werden. Tatsächlich lässt sich der Effekt der urbanen Hitzeinsel anhand der Temperaturdaten aus dem Jahr 2023 zwischen den Wetterstationen Berlin-Dahlem (städtischer Standort) und Angermünde (ländlicher Standort) identifizieren. Obwohl die Wetterstationen nur 101 km voneinander entfernt liegen, zeigen die Daten, dass in Berlin in elf von zwölf Monaten eine höhere Lufttemperatur herrscht als in Angermünde. Die dichte Bebauung und der Versiegelungsgrad tragen mitunter dazu bei, dass eine urbane Hitzeinsel in und über Berlin entstehen kann. Besonders sichtbar wird der UHI-Effekt und der damit verbundene Temperaturunterschied im Juni, die geringsten Abweichungen finden dagegen im September statt. Bei der Interpretation der Ergebnisse wird dennoch darauf hingewiesen, dass keine Informationen dazu vorliegen, ob die die Temperaturunterschiede der beiden Wetterstationen durch andere Faktoren begründet werden könnten.

3.1.5. Literatur#

Calvin, Katherine, Dipak Dasgupta, Gerhard Krinner, Aditi Mukherji, Peter W. Thorne, Christopher Trisos, José Romero, u. a. (2023). „IPCC, 2023: Climate Change 2023: Synthesis Report. Contribution of Working Groups I, II and III to the Sixth Assessment Report of the Intergovernmental Panel on Climate Change [Core Writing Team, H. Lee and J. Romero (Eds.)]. IPCC, Geneva, Switzerland.“ First. Intergovernmental Panel on Climate Change (IPCC). https://doi.org/10.59327/IPCC/AR6-9789291691647.

Oke, T. R., G. Mills, A. Christen, and J. A. Voogt. Urban Climates. Cambridge: Cambridge University Press (2017). „City size and the urban heat island“. Atmospheric Environment (1967) 7 (8): 769–79. https://doi.org/10.1016/0004-6981(73)90140-6.

Oginga Martins, Judith, und Ayyoob Sharifi (2022). World Cities Report 2022: Envisaging the Future of Cities. https://www.researchgate.net/profile/Judith-Oginga-Martins-2/publication/362479003_World_Cities_Report_2022_Envisaging_the_Future_of_Cities/links/62ebe42a0b37cc34476e2443/World-Cities-Report-2022-Envisaging-the-Future-of-Cities.pdf