pandas excel Datum Uhrzeit filtern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ing_datascience
User
Beiträge: 11
Registriert: Sonntag 24. April 2022, 20:01

Hallo zusammen,

ich habe eine xlsx Datei mit Messwerte von einem Jahr im Zeitintervall von 15 Minuten. Mit pandas habe ich ein Dataframe erstellt und auch schon erste Filter erstellen können (Ausgabe von Messwerte aus bestimmten Zeitbereichen).

Jetz möchte gerne die Daten des Dataframes ausgegeben bekommen, welche sich z.B. vom 01.01.2021 bis 31.03.2021 innerhalb des Zeitbereichs 08:15:00 bis 10:30:00 Uhr befinden. Wie bekomme ich das hin?

Mein aktueller code zum filtern der Messwerte sieht wie folgt aus:

import pandas as pd

df = pd.read_excel("Eingabetabelle.xlsx")

def Filter_winter():
winter_1=df.loc[lambda x: (x.Datum_2021 > "2021-01-01") & (x.Datum_2021 < "2021-03-01")]
winter_2=df.loc[lambda x: (x.Datum_2021 > "2021-12-01") & (x.Datum_2021 < "2022-01-01")]
winter_12=pd.concat([winter_1,winter_2])
print(winter_12)

Filter_winter()

Verschiedene Zeiträume innerhalb des DF zu filtern ist nicht das Problem, aber eine Lösung für eine weitere Filterung in Bezug auf die Uhrzeit finde ich gerade nicht.

Für ein besseres Verständnis zum DF habe ich mal ein Ausschnitt rein kopiert.

Datum_2021 Messwerte_2021
01.01.2021 00:15 224
01.01.2021 00:30 227,2
01.01.2021 00:45 222,4
01.01.2021 01:00 228,8
01.01.2021 01:15 222,4
01.01.2021 01:30 224
01.01.2021 01:45 227,2
01.01.2021 02:00 230,4
01.01.2021 02:15 227,2
01.01.2021 02:30 224
01.01.2021 02:45 222,4
01.01.2021 03:00 222,4
01.01.2021 03:15 230,4
01.01.2021 03:30 225,6
01.01.2021 03:45 224
01.01.2021 04:00 220,8
01.01.2021 04:15 235,2
01.01.2021 04:30 224
01.01.2021 04:45 225,6
01.01.2021 05:00 227,2
01.01.2021 05:15 222,4
01.01.2021 05:30 236,8
01.01.2021 05:45 225,6
01.01.2021 06:00 220,8
01.01.2021 06:15 222,4
01.01.2021 06:30 233,6


Vielen Dank schon mal vorab und viele Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 13998
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ing_datascience: Du vergleichst da Datumsangaben mit Zeichenketten, das kann so nicht funktionieren, zumal die Zeichenketten in den gezeigten Beispieldaten dann auch noch eine andere Reihenfolge von Tag, Monat, und Jahr und ein anderes Trennzeichen haben.

Die Spalte mit dem Zeitstempel muss einen entsprechenden Datentyp haben, oder wenn das eine Zeitreihe ist, vielleicht besser auch gar keine Spalte sondern ein Index vom entsprechenden Typ. Und dann schau halt mal in die Dokumentation wie man aus Zeitreihen Intervalle, Perioden, und so weiter herausfiltern kann. Pandas ist gut dokumentiert und gemacht für Zeitreihen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
derElch
User
Beiträge: 36
Registriert: Sonntag 25. Februar 2018, 13:14

Wie schon __blackjack__ geschrieben, zunächst die Spalte in datetime bringen (Stichwort: parse dates) danach kannst du die Zeitreihen sehr komfortabel gruppieren (Stichwort: Grouper) in deinem Fall würde sich TimeGrouper anbieten.
ing_datascience
User
Beiträge: 11
Registriert: Sonntag 24. April 2022, 20:01

Habt vielen Dank für eure schnelle Antworten. Ich werde es mal probieren und euch anschließend Bescheid geben, ob es funktioniert hat.
ing_datascience
User
Beiträge: 11
Registriert: Sonntag 24. April 2022, 20:01

Durch weitere Recherche konnte ich herausfinden, dass mir der Befehl "print(df.between_time('02:00', '03:00'))" weiter helfen wird. Allerdings ist es so wie ihr gesagt habt, dass meine Datumswerte nicht das richtige Format besitzen. Als Output zu dem Befehl erhalte ich folgende Fehlermeldung:

raise TypeError("Index must be DatetimeIndex")
TypeError: Index must be DatetimeIndex

Wenn ich mit der Funktion "print(df.dtypes)" mir die formate des df ausgeben lasse, erhalte ich folgende Ausgabe:

Datum_2021 datetime64[ns]
Messwerte_2021 float64
dtype: object

Das Format "datetime64[ns]" ist anscheinend nicht das geforderte. Ich habe gesehen, das pandas die Funktion "DatetimeIndex" anbietet.
Durch den Befehl "df["Datum_2021"] = pd.DatetimeIndex(df["Datum_2021"])" erhalte ich allerdings auch wieder das Format "datetime64[ns]".

Könnt ihr mir bitte weiterhelfen, wie ich die Datumswerte in in das geforderte Format umwandle, um die die Funktion "between_time" nutzen zu können?

Viele Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 13998
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ing_datascience: Der *Index* muss den entsprechenden Typ haben, nicht irgendeine Spalte. Bei ``print(df.between_time('02:00', '03:00'))`` wird ja auch nirgends eine Spalte angegeben.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
ing_datascience
User
Beiträge: 11
Registriert: Sonntag 24. April 2022, 20:01

@__blackjack__:
Danke! Dadurch habe ich jetzt Fehler gefunden. Beim einlesen der Excel-Datei musste lediglich den index festlegen, um den between_time Befehl nutzen zu können:
dfx = pd.read_excel("Werte_21.xlsx", index_col=0)
Antworten