2016-05-24 10 views
0

ich die Zeit zwischen zwei Spalte subtrahieren wollen: Ich habe das schon mit:, wie nur die Zeit der Datetime-Objekte in Python subtrahieren

Dies funktioniert und gibt ein Ergebnis, das wie folgt aussehen:

window 
-1 day, 23:29:00 
-1 day, 23:29:05 
-1 day, 23:29:10 
-1 day, 23:29:15 
-1 day, 23:29:20 
-1 day, 23:29:25 

Allerdings möchte ich nur den Zeitunterschied ie - 00:00:30. Ich habe versucht:

row['window'] = datetime.datetime.strptime(row['Time'], '%H:%M:%S.%f').time() - datetime.datetime.strptime(row['announcement_time'], '%H:%M:%S').time() 

Aber das gibt einen Fehler:

TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time' 

Ich habe auch versucht, x h, .minute und .second aber sehr gut funktioniert nicht. Kann mir bitte jemand helfen. Danke

+0

Haben Sie versucht, den Unterschied zu berechnen, bevor es Formating? Ich würde versuchen, wie datetime.datetime.strptime (row ['time'] - row ['ansage_time'], '% H:% M:% S') – fuuman

+0

Könnten Sie auch einige der tatsächlichen Eingabedaten veröffentlichen? – acdr

+0

Vielleicht möchten Sie nur Sekunden speichern: '(datetime.datetime.strptime (row ['Zeit'], '% H:% M:% S.% f') - datetime.datetime.strptime (row ['ansage_time' ], '% H:% M:% S')). Total_seconds() ' – Daniel

Antwort

0

Zeit Objekte haben keine Arithmetik, die ich kenne. Für die beste Vorgehensweise sollten Sie zum Beispiel (datetime.datetime object - datetime.datetime object).days verwenden.

You can read more about it here.

0

-1 day, 23:29:25 ist, wie negativ timedelta s gedruckt werden. Um 00:00:30 zu erhalten, verwenden abs():

>>> from datetime import timedelta 
>>> -timedelta(seconds=30) 
datetime.timedelta(-1, 86370) 
>>> str(-timedelta(seconds=30)) 
'-1 day, 23:59:30' 
>>> str(abs(-timedelta(seconds=30))) 
'0:00:30' 

Wenn timedelta() ist mehr als einen Tag, könnten Sie Moduloarithmetik anwenden, um die Zeitdifferenz innerhalb eines Tages zu bekommen:

>>> str(abs(-timedelta(days=10, seconds=30))) 
'10 days, 0:00:30' 
>>> str(abs(-timedelta(days=10, seconds=30)) % timedelta(days=1)) 
'0:00:30' 

Auf Python 2, % timedelta() ist nicht implementiert. Sie könnten .total_seconds() % 3600 stattdessen verwenden oder wenn Sie die ganze Anzahl von Sekunden brauchen dann nur Zugriff .seconds Attribut (es ist immer weniger als ein Tag):

>>> abs(-timedelta(days=10, seconds=30)).seconds 
30 
+0

danke für die ausführliche Antwort. Allerdings würde ich gerne die -30 Sekunden oder -10: 20 (minus 10 Minuten und 20 Sekunden) bekommen. oder ist es weg zu formatieren "-1 Tag, 23:29:05"? – duckman

+0

@ duckman ja. Wenn Sie den Wert nicht ändern müssen und Sie ihn nur anders formatieren möchten, ist dies eine [separate Frage] (http://stackoverflow.com/q/538666/4279). In Ihrem Fall könnten Sie am Ende hinzufügen: 'if diff jfs

Verwandte Themen