Einträge mit bestimmter Uhrzeit im timestamp filtern/selektieren

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
cpe10
User
Beiträge: 3
Registriert: Donnerstag 8. März 2018, 14:52

Hallo zusammen,

Ich bin ein relativer Python Neuling und möchte ein vorhandenes dataframe nach bestimmten Uhrzeiten bzw Zeitintervallen klassifizieren.
Das Dataframe besteht aus einem einem Wert, einer Geräte ID und dem dazugehörigen Zeitstempel.

Bild

Da es sich um sehr viele Einträge handel (ca. 600000) würde ich diese gerne einteilen um mir nur die relevanten Einträge (Tagsüber) anzuschauen.
Im ersten Schritt würde ich gerne alle Werte die Zwischen 08:50 und 18:10 Uhr filtern und anzeigen. Eine genauere Einteilung in kleinere Kategorien wäre ein nächster Schritt (08:50-10:40, 10:40-12:20, 12:20-13:50...).
Das habe ich bisher so versucht:

Code: Alles auswählen

mask = (data['Time'] >= '2014-08-17 08:50:00') & (data['Time'] <= '2014-08-17 18:10:00')
test = (data.loc[mask])
Das Problem dabei ist, dass ich (natürlich) nur die Einträge an dem einen Tag bekomme. ich hätte aber gerne eine Auflistung aller Tage zu dieser Uhrzeit.
Gibt es da in Python sowas wie: "ab diesem Zeichen der Zeichenkette" ('%08:50:00' ), oder muss ich das ganze komplett anders lösen?

Vielen Dank im Voraus :)
Benutzeravatar
Humbalan
User
Beiträge: 59
Registriert: Mittwoch 2. September 2009, 15:11

Hallo cpe10,

was Du möchtest, das ist doch filtern nach Zeiten. Da würde ich die Zeiten nicht als Strings vergleichen, sondern in datetime umwandeln und dann vergleichen.

Code: Alles auswählen

from datetime import datetime
my_datetime_1 = datetime.strptime( my_datetime_str, '%Y-%m-%d %H:%M:%S' )
Wobei my_datetime_str einer Deiner Zeitangaben aus der Tabelle ist. Die Details entnimm bitte der dazu gehörenden Beschreibung: https://docs.python.org/3/library/datet ... e.strptime. Der Link bezieht sich auf Python3, das gleiche gibt es für Python2 auch.

Nicht vergessen: data['Time'] sollte dann natürlich auch ein datetime sein.

Anschließend kannst Du Vergleichsoperatoren auf die Größen my_datetime_i anwenden.

Grüße
Humbalan
cpe10
User
Beiträge: 3
Registriert: Donnerstag 8. März 2018, 14:52

Hallo Humbalan,

danke für deine Antwort.
Mit dieser Variante kann ich allerdings nur einen Fixen Zeitpunkt auswählen und mit einem anderen vergleichen. Ich würde aber gerne alle Einträge (von jedem tag) zwischen 08:50 und 18:10 Uhr filtern und anzeigen. Gibt es eine Möglichkeit Ohne die Angabe eines Jahres/Monat/Tag die Werte zu vergleichen?

Viele Grüße! :)
Benutzeravatar
Humbalan
User
Beiträge: 59
Registriert: Mittwoch 2. September 2009, 15:11

Nur damit ich richtig verstehe: Du möchtest in einem Schritt alle Eintrag zwischen zwei Uhrzeiten gleichtzeitig für alle Tage? Also heute von 8:50 bis 18:10 plus gestern von 8:50 bis 18:10 plus vorgestern ... plus ...?
cpe10
User
Beiträge: 3
Registriert: Donnerstag 8. März 2018, 14:52

genau! ist das möglich?
Wenn ja, am besten mit einem Beispielcode.... :roll:
Benutzeravatar
Humbalan
User
Beiträge: 59
Registriert: Mittwoch 2. September 2009, 15:11

Aber natürlich (Python ist großartig!):

Code: Alles auswählen

from datetime import time, datetime

d1 = datetime(2016,3,11, 11,0) # 11.03.2016, 11:00
d2 = datetime(2017,3,12, 11,0) # 12.03.2017, 11:00
d3 = datetime(2018,3,13, 11,0) # 13.03.2018, 11:00
d4 = datetime(2018,3,13, 23,0) # 13.03.2018, 23:00, fliegt raus

datetimes = [d1, d2, d3, d4]

t1 = time( 8,50 )
t2 = time( 18,10 )

for item in datetimes :
    if t1 < item.time() and item.time() < t2 :
        print( item )
Wie du siehst, werden die ersten drei d's ausgegaben, das letzte nicht, da es nicht zwischen t1 und t2 liegt. Mehr Informationen findest Du in der Beschreibung des datetime-Moduls https://docs.python.org/3/library/datetime.html.

Natürlich müsste jetzt statt des print() eine andere Form der Weiterbearbeitung (z. B. in einer list sammeln) stehen, das möchte ich Dir überlassen :D .
Benutzeravatar
Humbalan
User
Beiträge: 59
Registriert: Mittwoch 2. September 2009, 15:11

@cpe10

Du hast seit zehn Tagen keine Antwort geschrieben und ich frage mich, ob ich Dir helfen konnte :K . Darf ich Dich bitten, ein Feedback zu den Beiträgen abzuliefern? :D
Antworten