Ich habe eine Funktion, die Informationen in Sekunden zurückgibt, aber ich muss diese Informationen in Stunden:Minuten:Sekunden speichern.
Gibt es einen einfachen Weg, um die Sekunden in diesem Format in Python umzuwandeln?
Ich habe eine Funktion, die Informationen in Sekunden zurückgibt, aber ich muss diese Informationen in Stunden:Minuten:Sekunden speichern.
Gibt es einen einfachen Weg, um die Sekunden in diesem Format in Python umzuwandeln?
Sie können die datetime.timedelta
Funktion verwenden:
>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
Das ist meiner Meinung nach der beste Weg, da Sie dann Arithmetik auf dem Zeitintervall und allen Datumsobjekten verwenden können.
Dies funktioniert für mehrere Tage: str(datetime.timedelta(seconds=60*60*24+1))
= '1 Tag, 0:00:01'
str(datetime.timedelta(seconds=round(666666.55)))
rendert korrekt Tage und unterdrückt die Dezimal-Sekunden.
Durch Verwendung der divmod()
Funktion, die nur eine einzige Division durchführt, um sowohl den Quotienten als auch den Rest zu erzeugen, können Sie das Ergebnis sehr schnell mit nur zwei mathematischen Operationen erhalten:
m, s = divmod(Sekunden, 60)
h, m = divmod(m, 60)
Und verwenden Sie dann String-Formatierung, um das Ergebnis in Ihre gewünschte Ausgabe zu konvertieren:
print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+
Wenn Sie Operator über Funktionen bevorzugen, verwenden Sie das Modulo; zum Beispiel (nur Minuten/Sekunden) : '%d:%02dmn' % (Sekunden / 60, Sekunden % 60)
@MarkRansom: und dann zu Monaten m, d = divmod(m, 31)
. Oooops, nein, das kannst du nicht. Schlimmer noch, dein Code wird falsch sein, wenn Schaltsekunden ins Spiel kommen. Lange Rede, kurzer Sinn: verwende timedelta
und verändere nicht den Kalender, es wird dich beißen.
Ich kann das kaum als einfachen Weg bezeichnen (zumindest kann ich mich nicht an die Syntax erinnern), aber es ist möglich, time.strftime zu verwenden, das mehr Kontrolle über das Formatieren ermöglicht:
from time import strftime
from time import gmtime
strftime("%H:%M:%S", gmtime(666))
'00:11:06'
strftime("%H:%M:%S", gmtime(60*60*24))
'00:00:00'
gmtime wird verwendet, um Sekunden in das spezielle Tupel-Format zu konvertieren, das strftime()
benötigt.
Hinweis: Truncates nach 23:59:59
Leider beginnt diese Methode mit der Messung von Tagen ab 1, daher ist sie nicht dazu gedacht, Zeitdeltas darzustellen, und somit ist ein Unfall vorprogrammiert. Zum Beispiel mit time.strftime('%d %H:%M:%S', time.gmtime(1))
=> '1 Tag, 0:00:01'.
Dies ist mein schneller Trick:
from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 Minuten und 42 Sekunden'
Für weitere Informationen besuchen Sie: https://humanfriendly.readthedocs.io/de/latest/api.html#humanfriendly.format_timespan
Du hast keine Ahnung, wie lange ich nach dieser Antwort gesucht habe. Vielen Dank. Ich wünschte, ich könnte dir mehr als eine +1 geben.
Erstaunlich. Passt sich sogar perfekt an, wenn die Sekunden riesig sind (604800
wird zu 1 Woche
).
@Armster Ich weiß, es ist ein wenig spät, aber für Antworten, bei denen ein einfaches Upvote nicht ausreicht, kannst du einen eigenen Bounty deiner Reputation verleihen.
datetime
:':0>8'
:from datetime import timedelta
"{:0>8}".format(str(timedelta(seconds=66)))
# Ergebnis: '00:01:06'
"{:0>8}".format(str(timedelta(seconds=666777)))
# Ergebnis: '7 Tage, 17:12:57'
"{:0>8}".format(str(timedelta(seconds=60*60*49+109)))
# Ergebnis: '2 Tage, 1:01:49'
':0>8'
:"{}".format(str(timedelta(seconds=66)))
# Ergebnis: '00:01:06'
"{}".format(str(timedelta(seconds=666777)))
# Ergebnis: '7 Tage, 17:12:57'
"{}".format(str(timedelta(seconds=60*60*49+109)))
# Ergebnis: '2 Tage, 1:01:49'
time
:from time import gmtime
from time import strftime
# HINWEIS: Das Folgende wird zurückgesetzt, wenn es über 23:59:59 geht!
strftime("%H:%M:%S", gmtime(125))
# Ergebnis: '00:02:05'
strftime("%H:%M:%S", gmtime(60*60*24-1))
# Ergebnis: '23:59:59'
strftime("%H:%M:%S", gmtime(60*60*24))
# Ergebnis: '00:00:00'
strftime("%H:%M:%S", gmtime(666777))
# Ergebnis: '17:12:57'
# Falsch
Es schlägt fehl, wenn der Unterschied weniger als eine Sekunde beträgt: "{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
An alle anderen: Im ohne ':0>8':
Beispiel fehlt eine führende 0. {:0>8}
fügt links 8 Nullen hinzu.
In Python 3.5.2 erhalte ich einen TypeError. Ich formatiere eine time.time()-start
Variable. Irgendwelche Einsichten? TypeError: nicht leere Formatzeichenkette an object.__format__ übergeben
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
31 Stimmen
Das Inverse dieses Problems kann unter Wie kann man einen H:MM:SS Zeit-String in Sekunden in Python umwandeln? gefunden werden.