387 Stimmen

Umrechnung eines Zeitdeltas in Tage, Stunden und Minuten

Ich habe ein Timedelta. Ich möchte die Tage, Stunden und Minuten davon - entweder als Tupel oder als Wörterbuch... Das ist mir egal.

Ich muss dies ein Dutzend Mal in einem Dutzend Sprachen im Laufe der Jahre getan haben, aber Python hat in der Regel eine einfache Antwort auf alles, so dass ich dachte, ich würde hier fragen, bevor busting aus einigen ekelhaft einfach (aber wortreich) Mathematik.

Herr Fooz spricht ein gutes Argument an.

Ich habe es mit "Angeboten" zu tun (ähnlich wie bei ebay), bei denen jedes Angebot eine bestimmte Dauer hat. Ich versuche, die verbleibende Zeit zu ermitteln, indem ich when_added + duration - now

Liege ich richtig, wenn ich behaupte, dass dies nicht mit der Sommerzeit zusammenhängt? Wenn nicht, wie kann man am einfachsten eine Stunde addieren/subtrahieren?

9voto

Mathieu CAROFF Punkte 880

Ich habe das Folgende verwendet:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")

6voto

Timothy C. Quinn Punkte 2697

Hier ist eine kleine Funktion, die ich zusammengestellt habe, um dies bis auf Mikrosekunden genau zu tun:

def tdToDict(td:datetime.timedelta) -> dict:
    def __t(t, n):
        if t < n: return (t, 0)
        v = t//n
        return (t -  (v * n), v)
    (s, h) = __t(td.seconds, 3600)
    (s, m) = __t(s, 60)    
    (micS, milS) = __t(td.microseconds, 1000)

    return {
         'days': td.days
        ,'hours': h
        ,'minutes': m
        ,'seconds': s
        ,'milliseconds': milS
        ,'microseconds': micS
    }

Hier ist eine Version, die eine tuple :

# usage: (_d, _h, _m, _s, _mils, _mics) = tdTuple(td)
def tdTuple(td:datetime.timedelta) -> tuple:
    def _t(t, n):
        if t < n: return (t, 0)
        v = t//n
        return (t -  (v * n), v)
    (s, h) = _t(td.seconds, 3600)
    (s, m) = _t(s, 60)    
    (mics, mils) = _t(td.microseconds, 1000)
    return (td.days, h, m, s, mics, mils)

6voto

Fei Yao Punkte 1152

Während pandas.Timedelta diese Attribute nicht direkt zur Verfügung stellt, bietet es eine Methode namens total_seconds auf deren Grundlage sich Tage, Stunden und Minuten leicht ableiten lassen:

import pandas as pd
td = pd.Timedelta("2 days 12:30:00")
minutes = td.total_seconds()/60
hours = minutes/60
days = hours/ 24
print(minutes, hours, days)

3voto

Daliang LYU Punkte 61

Der einfachste Weg ist die Verwendung von str(timedelta) . Es wird ein Stich zurückgegeben, der wie folgt formatiert ist 3 days, 21:06:40.001000 und Sie können Stunden und Minuten mit einfachen String-Operationen oder regulären Ausdrücken analysieren.

1voto

jslatane Punkte 190

Dies ist ein weiterer möglicher Ansatz, wenn auch ein wenig wortreicher als die bereits genannten. Es ist vielleicht nicht der beste Ansatz für dieses Szenario, aber es ist praktisch, die Zeitdauer in einer bestimmten Einheit zu erhalten, die nicht im Objekt gespeichert ist (Wochen, Stunden, Minuten, Millisekunden) und ohne sich an Umrechnungsfaktoren erinnern oder sie berechnen zu müssen.

from datetime import timedelta
one_hour = timedelta(hours=1)
one_minute = timedelta(minutes=1)
print(one_hour/one_minute)  # Yields 60.0

Ich habe ein Timedelta. Ich möchte die Tage, Stunden und Minuten davon - entweder als Tupel oder als Wörterbuch... Das ist mir egal.

in_time_delta = timedelta(days=2, hours=18, minutes=30)
td_d = timedelta(days=1)
td_h = timedelta(hours=1)
td_m = timedelta(minutes=1)
dmh_list = [in_time_delta.days,
            (in_time_delta%td_d)//td_h,
            (in_time_delta%td_h)//td_m]

Die zuweisen sollte [2, 18, 30] a dmh_list

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