timedelta nach Zeiteinheiten aufteilen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ich hab das Gefühl, dass ich es mir kompliziert mache, aber irgendwie will mir kein generischer Weg einfallen um die Daten eines timedelta Objekts in ihre Zeiteinheiten aufzuteilen.
Die Aufteilung in Jahre hab ich direkt raus gelassen um so Dingen wie Schaltjahren usw. aus dem Weg zu gehen. ;)

Code: Alles auswählen

from operator import mul
from datetime import datetime, timedelta

def extract_timeparts(dt):
    """ 
    extract the values for days, hours, seconds, milli- and microseconds
    as dict from a timedelta like object
    
    """   
    infos = {"days" : dt.days,
             "milliseconds" : dt.microseconds / 1000,
             "microseconds" : dt.microseconds % 1000}
    factors = [60, 60, 1] 
    rest = dt.seconds
    for i, name in enumerate(("hours", "minutes", "seconds")):
        factor = reduce(mul, factors[i:])
        infos[name] = rest / factor
        rest -= (infos[name] * factor)
    return infos
         
print ("Dieses Jahr hat noch %(days)s Tage, %(hours)s Stunden, "
       "%(minutes)s Minuten, %(seconds)s Sekunden, %(milliseconds)s "
       "Millisekunden und %(microseconds)s Millionstelsekunden."
       ) % extract_timeparts(datetime(2010, 1, 1) - datetime.now())
Vielleicht hat ja jemand Lust und Zeit mir zu zeigen wie es besser geht.
Vielleicht gibt es auch schon was fertiges in den builtins was ich bisher nicht kenne.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Auch nicht sehr elegant, aber vielleicht besser?

Code: Alles auswählen

>>> import datetime
>>> dt = datetime.datetime(2010, 1, 1) - datetime.datetime.now()
>>> dt = datetime.datetime(2000, 1, 1) + dt
>>> dt.year - 2000
0
>>> dt.month - 1
6
>>> dt.day - 1
7
>>> dt.hour
11
>>> dt.second
32
Antworten