716 Stimmen

Wie konvertiere ich Sekunden in Stunden, Minuten und Sekunden?

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?

31 Stimmen

Das Inverse dieses Problems kann unter Wie kann man einen H:MM:SS Zeit-String in Sekunden in Python umwandeln? gefunden werden.

1194voto

SilentGhost Punkte 285785

Sie können die datetime.timedelta Funktion verwenden:

>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'

13 Stimmen

Das ist meiner Meinung nach der beste Weg, da Sie dann Arithmetik auf dem Zeitintervall und allen Datumsobjekten verwenden können.

20 Stimmen

Dies funktioniert für mehrere Tage: str(datetime.timedelta(seconds=60*60*24+1)) = '1 Tag, 0:00:01'

9 Stimmen

str(datetime.timedelta(seconds=round(666666.55))) rendert korrekt Tage und unterdrückt die Dezimal-Sekunden.

710voto

Brandon Rhodes Punkte 75647

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+

3 Stimmen

Wenn Sie Operator über Funktionen bevorzugen, verwenden Sie das Modulo; zum Beispiel (nur Minuten/Sekunden) : '%d:%02dmn' % (Sekunden / 60, Sekunden % 60)

22 Stimmen

Und Sie können es auf Tage erweitern: d, h = divmod(h, 24).

22 Stimmen

@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.

99voto

anatoly techtonik Punkte 18578

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

20 Stimmen

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'.

1 Stimmen

Kann keine Dezimalstellen für Sekunden=0.0236 anzeigen (wie Božo Stojkovic's Antwort tut)

77voto

doories Punkte 501

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

5 Stimmen

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.

1 Stimmen

Erstaunlich. Passt sich sogar perfekt an, wenn die Sekunden riesig sind (604800 wird zu 1 Woche).

1 Stimmen

@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.

76voto

marcell Punkte 1204

Verwendung von datetime:

Mit dem Format ':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'

Ohne das Format ':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'

Verwendung von 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

1 Stimmen

Es schlägt fehl, wenn der Unterschied weniger als eine Sekunde beträgt: "{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'

3 Stimmen

An alle anderen: Im ohne ':0>8': Beispiel fehlt eine führende 0. {:0>8} fügt links 8 Nullen hinzu.

2 Stimmen

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.com

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.

Powered by:

X