Wie konvertiere ich datetime.timedelta in Minuten, Stunden in Python?

Lesezeit: 7 Minuten

Wie konvertiere ich datetimetimedelta in Minuten Stunden in Python
Benutzer1881957

Ich bekomme ein start_date wie folgt:

from django.utils.timezone import utc
import datetime

start_date = datetime.datetime.utcnow().replace(tzinfo=utc)
end_date = datetime.datetime.utcnow().replace(tzinfo=utc)
duration = end_date - start_date

Ich bekomme so eine Ausgabe:

datetime.timedelta(0, 5, 41038)

Wie kann ich dies wie folgt in normale Zeit umwandeln?

10 Minuten, 1 Stunde so

  • mögliches Duplikat von Zeitdelta in Tage, Stunden und Minuten umwandeln

    – Anto

    6. Januar ’14 um 15:18 Uhr

  • Die Tatsache, dass so viele Leute das nachschlagen, zeigt, dass das Datetime-Modul diese grundlegende Funktion haben sollte …

    – theQuestionMan

    16. Februar ’21 bei 4:14

1641814042 859 Wie konvertiere ich datetimetimedelta in Minuten Stunden in Python
abarnert

Es gibt keinen integrierten Formatierer für timedelta Objekte, aber es ist ziemlich einfach, es selbst zu tun:

days, seconds = duration.days, duration.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

Oder entsprechend, wenn Sie Python 2.7+ oder 3.2+ verwenden:

seconds = duration.total_seconds()
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

Jetzt können Sie es nach Belieben ausdrucken:

'{} minutes, {} hours'.format(minutes, hours)

Beispielsweise:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = days * 24 + seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return hours, minutes, seconds
td = datetime.timedelta(2, 7743, 12345)
hours, minutes, seconds = convert_timedelta(td)
print '{} minutes, {} hours'.format(minutes, hours)

Dies wird gedruckt:

9 minutes, 50 hours

Wenn Sie “10 Minuten, 1 Stunde” anstelle von “10 Minuten, 1 Stunde” erhalten möchten, müssen Sie dies ebenfalls manuell tun:

print '{} minute{}, {} hour{}'.format(minutes, 's' if minutes != 1 else '',
                                      hours, 's' if minutes != 1 else '')

Oder schreiben Sie ein english_plural Funktion, um dies zu tun 's' Bits für Sie, anstatt sich zu wiederholen.

Aus Ihren Kommentaren geht hervor, dass Sie die Tage eigentlich getrennt halten möchten. Das geht noch einfacher:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return days, hours, minutes, seconds

Wenn Sie dies in einen einzelnen Wert zum Speichern in einer Datenbank konvertieren möchten, konvertieren Sie diesen einzelnen Wert zurück, um ihn zu formatieren, gehen Sie wie folgt vor:

def dhms_to_seconds(days, hours, minutes, seconds):
    return (((days * 24) + hours) * 60 + minutes) * 60 + seconds

def seconds_to_dhms(seconds):
    days = seconds // (3600 * 24)
    hours = (seconds // 3600) % 24
    minutes = (seconds // 60) % 60
    seconds = seconds % 60
    return days, hours, minutes, seconds

Also zusammenstellen:

def store_timedelta_in_database(thingy, duration):
    seconds = dhms_to_seconds(*convert_timedelta(duration))
    db.execute('INSERT INTO foo (thingy, duration) VALUES (?, ?)',
               thingy, seconds)
    db.commit()

def print_timedelta_from_database(thingy):
    cur = db.execute('SELECT duration FROM foo WHERE thingy = ?', thingy)
    seconds = int(cur.fetchone()[0])
    days, hours, minutes, seconds = seconds_to_dhms(seconds)
    print '{} took {} minutes, {} hours, {} days'.format(thingy, minutes, hours, days)

  • Außerdem: Was ist, wenn die Dauer mehr als einen Tag überschreitet? Ich möchte es im Tagesformat anzeigen.

    – Benutzer1881957

    7. Januar ’13 um 5:29

  • Ein weiteres Problem, da die Stunden und Minuten in einer separaten Variablen gespeichert werden, wie kann ich all diese in eine einzelne Spalte namens Attribut einfügen.

    – Benutzer1881957

    7. Januar ’13 um 5:33

  • Wenn Sie Tage drucken möchten, ist es noch einfacher; Mischen Sie sie nur nicht ein. Ich werde die Antwort bearbeiten, um sie zu demonstrieren. Was die zweite Frage angeht, bin ich mir nicht sicher, was du meinst. Welches Format ist attribute soll sein? Meine erste Vermutung ist, dass Sie eigentlich nur eine einzige speichern möchten seconds Nummer in der Datenbank und analysieren Sie sie jedes Mal, wenn Sie sie abrufen; meinst Du das?

    – abarnert

    7. Januar ’13 um 5:43

  • Bearbeiten Sie die Frage mit Codes. Ja, ich speichere in Sekundenschnelle in der Datenbank. Dann, während ich dem Benutzer zeige, möchte ich als geeignet in Minuten, Stunden oder Tagen parsen. Danke

    – Benutzer1881957

    7. Januar ’13 bei 5:51

  • @ user1881957: Ich bin mir nicht sicher, was Sie mit “Bearbeiten der Frage mit Codes” meinen. Sie haben die Frage nicht bearbeitet. Ich habe die Antwort bereits bearbeitet, um höchstwahrscheinlich alle Konvertierungsfunktionen anzuzeigen, die Sie jemals benötigen werden (und wenn nicht, sollte es einfach sein, Ihre eigenen zu schreiben, indem Sie sie als Anleitung verwenden). Brauchen Sie noch etwas?

    – abarnert

    7. Januar ’13 um 6:15

EIN datetime.timedelta entspricht dem Unterschied zwischen zwei Daten, kein Datum selbst. Es wird nur in Tagen, Sekunden und Mikrosekunden ausgedrückt, da größere Zeiteinheiten wie Monate und Jahre nicht sauber zerlegt werden (ist 30 Tage 1 Monat oder 0,9677 Monate?).

Wenn Sie a umwandeln möchten timedelta in Stunden und Minuten, können Sie die total_seconds() Methode, um die Gesamtzahl der Sekunden zu erhalten und dann etwas zu rechnen:

x = datetime.timedelta(1, 5, 41038)  # Interval of 1 day and 5.41038 seconds
secs = x.total_seconds()
hours = int(secs / 3600)
minutes = int(secs / 60) % 60

  • AttributeError: ‘datetime.timedelta’ Objekt hat kein Attribut ‘total_seconds’

    – Benutzer1881957

    7. Januar ’13 um 5:28

  • @user1881957: total_seconds wurde hinzugefügt in… Ich glaube 2.7 und 3.2. Wenn Sie 2.6 oder 3.1 oder früher verwenden, verwenden Sie das explizite days/seconds Alternative aus meiner Antwort; es ist nicht viel anders.

    – abarnert

    7. Januar ’13 um 5:42

Es sind keine benutzerdefinierten Hilfsfunktionen erforderlich, wenn wir nur die Zeichenfolge des Formulars drucken müssen [D day[s], ][H]H:MM:SS[.UUUUUU]. Zeitdelta Objektträger str() Operation, die dies tun wird. Es funktioniert sogar in Python 2.6.

>>> from datetime import timedelta
>>> timedelta(seconds=90136)
datetime.timedelta(1, 3736)
>>> str(timedelta(seconds=90136))
'1 day, 1:02:16'

  • Abgesehen von der seltsamen Ausgabeformatanforderung der Frage (die meiner Meinung nach nicht wirklich die eigentliche Anforderung ist, sondern nur das OP hat Probleme, sich auszudrücken), sollte dies die akzeptierte Antwort sein.

    – Peter Mortensen

    29. Okt ’18 um 23:22


Ich glaube nicht, dass es eine gute Idee ist, sich selbst zu berechnen.

Wenn Sie nur eine hübsche Ausgabe wünschen, konvertieren Sie sie einfach in str mit str() Funktion oder direkt print() es.

Und wenn die Stunden und Minuten weiter verwendet werden, können Sie sie analysieren, um datetime Objektnutzung datetime.strptime()(und extrahiere den Zeitteil mit datetime.time() Methode), zum Beispiel:

import datetime

delta = datetime.timedelta(seconds=10000)
time_obj = datetime.datetime.strptime(str(delta),'%H:%M:%S').time()

Wie konvertiere ich datetimetimedelta in Minuten Stunden in Python
Unendlichkeit

Benutz einfach strftime 🙂

So ähnlich:

my_date = datetime.datetime(2013, 1, 7, 10, 31, 34, 243366, tzinfo=<UTC>)
print(my_date.strftime("%Y, %d %B"))

Nachdem Sie Ihre Frage zum Formatieren bearbeitet haben timedelta, Du könntest benutzen:

def timedelta_tuple(timedelta_object):
   return timedelta_object.days, timedelta_object.seconds//3600, (timedelta_object.seconds//60)%60

1641814042 248 Wie konvertiere ich datetimetimedelta in Minuten Stunden in Python
MobilePro.pl

Ich habe eine eigene Hilfsfunktion definiert, um das timedelta-Objekt in das ‘HH:MM:SS’-Format zu konvertieren – nur Stunden, Minuten und Sekunden, ohne Stunden in Tage zu ändern.

def format_timedelta(td):
    hours, remainder = divmod(td.total_seconds(), 3600)
    minutes, seconds = divmod(remainder, 60)
    hours, minutes, seconds = int(hours), int(minutes), int(seconds)
    if hours < 10:
        hours="0%s" % int(hours)
    if minutes < 10:
        minutes="0%s" % minutes
    if seconds < 10:
        seconds="0%s" % seconds
    return '%s:%s:%s' % (hours, minutes, seconds)

Wie konvertiere ich datetimetimedelta in Minuten Stunden in Python
zzzz zzzz

# Try this code
from datetime import timedelta

class TimeDelta(timedelta):
    def __str__(self):
        _times = super(TimeDelta, self).__str__().split(':')
        if "," in _times[0]:
            _hour = int(_times[0].split(',')[-1].strip())
            if _hour:
                _times[0] += " hours" if _hour > 1 else " hour"
            else:
                _times[0] = _times[0].split(',')[0]
        else:
            _hour = int(_times[0].strip())
            if _hour:
                _times[0] += " hours" if _hour > 1 else " hour"
            else:
                _times[0] = ""
        _min = int(_times[1])
        if _min:
            _times[1] += " minutes" if _min > 1 else " minute"
        else:
            _times[1] = ""
        _sec = int(_times[2])
        if _sec:
            _times[2] += " seconds" if _sec > 1 else " second"
        else:
            _times[2] = ""
        return ", ".join([i for i in _times if i]).strip(" ,").title()

# Test
>>> str(TimeDelta(seconds=10))
'10 Seconds'
>>> str(TimeDelta(seconds=60))
'01 Minute'
>>> str(TimeDelta(seconds=90))
'01 Minute, 30 Seconds'
>>> str(TimeDelta(seconds=3000))
'50 Minutes'
>>> str(TimeDelta(seconds=3600))
'1 Hour'
>>> str(TimeDelta(seconds=3690))
'1 Hour, 01 Minute, 30 Seconds'
>>> str(TimeDelta(seconds=3660))
'1 Hour, 01 Minute'
>>> str(TimeDelta(seconds=3630))
'1 Hour, 30 Seconds'
>>> str(TimeDelta(seconds=3600*20))
'20 Hours'
>>> str(TimeDelta(seconds=3600*20 + 3000))
'20 Hours, 50 Minutes'
>>> str(TimeDelta(seconds=3600*20 + 3630))
'21 Hours, 30 Seconds'
>>> str(TimeDelta(seconds=3600*20 + 3660))
'21 Hours, 01 Minute'
>>> str(TimeDelta(seconds=3600*20 + 3690))
'21 Hours, 01 Minute, 30 Seconds'
>>> str(TimeDelta(seconds=3600*24))
'1 Day'
>>> str(TimeDelta(seconds=3600*24 + 10))
'1 Day, 10 Seconds'
>>> str(TimeDelta(seconds=3600*24 + 60))
'1 Day, 01 Minute'
>>> str(TimeDelta(seconds=3600*24 + 90))
'1 Day, 01 Minute, 30 Seconds'
>>> str(TimeDelta(seconds=3600*24 + 3000))
'1 Day, 50 Minutes'
>>> str(TimeDelta(seconds=3600*24 + 3600))
'1 Day, 1 Hour'
>>> str(TimeDelta(seconds=3600*24 + 3630))
'1 Day, 1 Hour, 30 Seconds'
>>> str(TimeDelta(seconds=3600*24 + 3660))
'1 Day, 1 Hour, 01 Minute'
>>> str(TimeDelta(seconds=3600*24 + 3690))
'1 Day, 1 Hour, 01 Minute, 30 Seconds'
>>> str(TimeDelta(seconds=3600*24*2))
'2 Days'
>>> str(TimeDelta(seconds=3600*24*2 + 9999))
'2 Days, 2 Hours, 46 Minutes, 39 Seconds'

.

297910cookie-checkWie konvertiere ich datetime.timedelta in Minuten, Stunden in Python?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy