Dataframe mit Messungen für Grafikausgabe vorbereiten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
TommiWe
User
Beiträge: 2
Registriert: Donnerstag 7. Januar 2021, 18:53

Hallo!
Ich bin neu hier und bin seit einigen wenigen Monaten mit Python unterwegs. Mir fehlt daher noch eine ganze Menge an Erfahrung. Nach Studium diverser Seiten und Belegung eines Online-Kurses habe ich mich jetzt in ein kleines Projekt gestürzt. Mein Ziel ist es, öffentlich zugängliche Daten des DWDs für mich aufzubereiten. Ich habe mir daher von einer Messstation die Regendaten heruntergeladen und in Pandas als CSC eingelesen. Die Datenstruktur sieht folgendermaßen aus.

Code: Alles auswählen

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 13200 entries, 0 to 13199
Data columns (total 7 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   STATIONS_ID  13200 non-null  int64  
 1   MESS_DATUM   13200 non-null  int64  
 2   QN_8         13200 non-null  int64  
 3   R1           13200 non-null  float64
 4   RS_IND       13200 non-null  int64  
 5   WRTR         13200 non-null  int64  
 6   eor          13200 non-null  object 
dtypes: float64(1), int64(5), object(1)
memory usage: 722.0+ KB
Wie Ihr sehen könnt, enthält die Spalte "MESS_DATUM" keine DateTime-Werte. Ich möchte gerne am Ende die Regendaten nach Tagen, Wochen, Monaten und Jahren auswerten und diese dann grafisch darstellen lassen.

Ich habe dann eine neue Spalte angefügt und aus der Spalte "MESS_DATUM" eine Spalte mit DateTime-Objekten über folgende Code erzeugt:

Code: Alles auswählen

df_hw["MD_DT_neu"] = df_hw["MESS_DATUM"].apply(lambda i: datetime.strptime(str(i)[0:], format("%Y%m%d%H")))
Das hat hervorragend funktioniert. Mit folgendem Befehl kann ich mir das Dataframe nach meinen Wünschen gruppieren lassen und z. B. die Wochensumme ausgeben lassen.

Code: Alles auswählen

df_hw_week = df_hw.groupby(df_hw['MD_DT_neu'].dt.isocalendar().week)
Mein Problem ist, dass die restlichen Spalten das Dataframe auch aufsummiert werden und ich in einer Grafikausgabe mittels der Plot-Funktion von Pandas keine Datumswerte mehr für die x-Achse habe.
Ich lese seit Tagen, habe aber das Gefühl, dass ich mich immer im Kreis drehe.
Ich wäre für Tipps dankbar.

Liebe Grüße
Thomas
TommiWe
User
Beiträge: 2
Registriert: Donnerstag 7. Januar 2021, 18:53

Hallo!
Ich habe noch weiter probiert und habe jetzt einen Dataframe, der als Index eine TimeSeries hat. Ich arbeite jetzt mit "resample", um mir Tages-, Wochen- bzw. Monatsdaten abzugreifen. Die grafische Darstellung mittels Matplotlib im "OO-Modus" als Linie klappt auch. Ich möchte jetzt die Daten statt als Linie als Blockgrafik (bar) ausgegeben bekommen. Also z. B. Summe der Niederschläge pro Woche als Balken. Das scheitert leider daran, dass ich die X-Werte (Datum) noch als Index habe und nicht als separate Spalte mit x-Werten. Wie bekomme ich denn jetzt die Darstellung hin? Kann mir da jemand von Euch weiterhelfen? Ich hoffe, ich konnte mein Anliegen verständlich formulieren.
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Hmmmm also leider bin Ich etwas schwer von Begriff aber Ich hoffe Ich verstehe dich richtig :DDD

Also mit Matplotlib kenne Ich mich leider gar nicht aus ( Ich arbeite seit Monaten mit pandas )aber zurück zum Thema.

Das was Ich nicht genau verstehe ob du die Summe pro Tag über eine Woche oder direkt für die ganze Woche haben möchtest.

Für die Wochen:

Code: Alles auswählen

import pandas as pd
import numpy as np

index = pd.date_range(start='1/1/2020',end="31/1/2020")
niederschlag = pd.Series(np.random.randint(0, 100, size=31), index)
niederschlag_pro_Woche= niederschlag.groupby(pd.Grouper(freq="1W")).sum(min_count=1)
print(niederschlag_pro_Woche)

Code: Alles auswählen

2020-01-05    192 #1 Januar -> Woche  30 Dez -05 Jan
2020-01-12    191
2020-01-19    411
2020-01-26    311
2020-02-02    187
Freq: W-SUN, dtype: int32


P.S min_count bedeutet das min 1 "echter Wert vorhanden sein muss ( int , float etc)" sollten weniger vorhanden sein ( zum Beispiel weil die anderen alle NaN sind ) ist die gesamtsumme ebenfalls NaN

Und sonst müsstest du wenn du einen anderen Datensatz hast zum Beispiel pro min:

Beispiel:
01-01-2020 00:00 5
01-01-2020 00:01 6
.
.
etc...

Code: Alles auswählen

niederschlag_pro_Tag= niederschlag.groupby(pd.Grouper(freq="D")).sum(min_count=1)
Hier würde dann eine Series zurückgegeben werden wo die Summe pro Tag ermittelt wird und dann könntest du es genau wie oben machen

Ich hoffe Ich habe es richtig verstanden und konnte dir helfen
Eine Vision ohne Aktion bleibe eine Illusion
Antworten