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.

25voto

naive decoder Punkte 171

Die folgende Gruppe hat für mich funktioniert.

def sec_to_hours(seconds):
    a=str(seconds//3600)
    b=str((seconds%3600)//60)
    c=str((seconds%3600)%60)
    d=["{} Stunden {} Minuten {} Sekunden".format(a, b, c)]
    return d

print(sec_to_hours(10000))
# ['2 Stunden 46 Minuten 40 Sekunden']

print(sec_to_hours(60*60*24+105))
# ['24 Stunden 1 Minute 45 Sekunden']

0 Stimmen

Sie sollten a, b und c wahrscheinlich runden

0 Stimmen

@JeanRavenclaw: a, b und c sind Ganzzahlen - tatsächlich zu Zeichenketten konvertierte Ganzzahlen.

0 Stimmen

b, c = divmod(Sekunden % 3600, 60) wäre etwas knapper.

15voto

Tomas Trdla Punkte 923

Eine etwas abweichende Antwort, aber vielleicht hilfreich für jemanden

def time_format(seconds: int) -> str:
    if seconds is not None:
        seconds = int(seconds)
        d = seconds // (3600 * 24)
        h = seconds // 3600 % 24
        m = seconds % 3600 // 60
        s = seconds % 3600 % 60
        if d > 0:
            return '{:02d}T {:02d}S {:02d}m {:02d}s'.format(d, h, m, s)
        elif h > 0:
            return '{:02d}S {:02d}m {:02d}s'.format(h, m, s)
        elif m > 0:
            return '{:02d}m {:02d}s'.format(m, s)
        elif s > 0:
            return '{:02d}s'.format(s)
    return '-'

Ergebnis:

print(time_format(25*60*60 + 125)) 
>>> 01T 01S 02m 05s
print(time_format(17*60*60 + 35)) 
>>> 17S 00m 35s
print(time_format(3500)) 
>>> 58m 20s
print(time_format(21)) 
>>> 21s

0 Stimmen

Deine Einrückung ist kaputt.

14voto

Sam Punkte 410

Stunden (h) berechnet durch ganzzahlige Division (mit //) von Sekunden durch 3600 (60 Min./h * 60 Sek./Min.)

Minuten (m) berechnet durch ganzzahlige Division der verbleibenden Sekunden (Rest der Stundenberechnung durch %) durch 60 (60 Sek./Min.)

Genauso werden Sekunden (s) durch den Rest der Stunden- und Minutenberechnung ermittelt.

Der Rest ist nur noch die Zeichenkettenformatierung!

def hms(seconds):
    h = seconds // 3600
    m = seconds % 3600 // 60
    s = seconds % 3600 % 60
    return '{:02d}:{:02d}:{:02d}'.format(h, m, s)

print(hms(7500))  # Sollte 02h05m00s ausgeben

0 Stimmen

Während dieser Code möglicherweise eine Lösung für die Frage des OPs bietet, ist es besser, Kontext hinzuzufügen, um zu erklären, warum/wie es funktioniert. Dies kann zukünftigen Benutzern helfen, zu lernen und dieses Wissen auf ihren eigenen Code anzuwenden. Sie erhalten wahrscheinlich auch positives Feedback von Benutzern in Form von Upvotes, wenn der Code erklärt wird.

12voto

ddzzbbwwmm Punkte 2195

Das ist wie ich es bekommen habe.

def sec2time(sec, n_msec=3):
    ''' Sekunden in 'D Tage, HH:MM:SS.FFF' umwandeln '''
    if hasattr(sec,'__len__'):
        return [sec2time(s) for s in sec]
    m, s = divmod(sec, 60)
    h, m = divmod(m, 60)
    d, h = divmod(h, 24)
    if n_msec > 0:
        pattern = '%%02d:%%02d:%%0%d.%df' % (n_msec+3, n_msec)
    else:
        pattern = r'%02d:%02d:%02d'
    if d == 0:
        return pattern % (h, m, s)
    return ('%d Tage, ' + pattern) % (d, h, m, s)

Einige Beispiele:

$ sec2time(10, 3)
Ergebnis: '00:00:10.000'

$ sec2time(1234567.8910, 0)
Ergebnis: '14 Tage, 06:56:07'

$ sec2time(1234567.8910, 4)
Ergebnis: '14 Tage, 06:56:07.8910'

$ sec2time([12, 345678.9], 3)
Ergebnis: ['00:00:12.000', '4 Tage, 00:01:18.900']

1 Stimmen

Was ist der Vorteil gegenüber der Antwort oben? str(datetime.timedelta(seconds=666))

1 Stimmen

@RiazRizvi gibt eine konsistente Zeichenlänge für Mikrosekunden für die Werte 666.0 und 666.1 an.

11voto

MarSoft Punkte 3182

Wenn Sie den Wert datetime.time benötigen, können Sie diesen Trick verwenden:

my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()

Sie können kein timedelta zu time hinzufügen, aber können es zu datetime hinzufügen.

UPD: Eine weitere Variation der gleichen Technik:

my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()

Anstelle von 1 können Sie jede Zahl größer als 0 verwenden. Hier verwenden wir die Tatsache, dass datetime.fromordinal immer ein datetime-Objekt mit einem time-Bestandteil von null zurückgibt.

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