Seite 1 von 1

sekunden in grössere zeiteinheiten umrechnen

Verfasst: Freitag 20. März 2009, 20:57
von kryz
hallo

ich möchte sekunden umrechnen in grössere zeiteinheiten. z.b. 62 sec = 1min & 2 sec. mit den modulen time und datetime finde ich keine 'einfache' lösung. nun habe ich mal folgendes geschrieben

Code: Alles auswählen

def computeSecondsToHigherUnits(seconds, highestUnit):
    """
    berechnet aus seconds anz. sekunden, minuten, ... 
    
    @param seconds: zeit in sekunden
    @type seconds: float oder int
    @param highestUnit: grösste zu berechnende zeiteinheit. möglich: sec, min, h, d, week, year
    @type highestUnit: string
    """
    units = ['sec', 'min', 'h', 'd'] #reihe der einheiten
    unreached = {'sec': 60, #nicht zu erreichen, falls highestUnit eine grössere zeiteinheit ist
                 'min': 60,
                 'h': 24
                }
    #anfügen von grösserer zeiteinheit zu units und unreached
    if highestUnit == 'week':
        units.append('week')
        unreached['d'] = 7
    elif highestUnit == 'year':
        units.append('year')
        unreached['d'] = 365
    #behandeln von nachkommastellen bei seconds
    res = {'partSec': seconds - int(seconds)}
    seconds = int(seconds)
    #berechnen der zeiten pro zeiteinheit
    left = seconds
    i = 0
    while left:
        if units.index(highestUnit) > i:
            res[units[i]] = left%unreached[units[i]] #anteil der aktuellen zeiteinheit
            left = int(left/unreached[units[i]]) #übrigbleibende zeit in der nächst grösseren zeiteinheit
        else:
            res[units[i]] = left
            break
        i += 1
    return res
aber da wird es doch wohl eine einfachere und schönere lösung zum problem geben?

Re: sekunden in grössere zeiteinheiten umrechnen

Verfasst: Freitag 20. März 2009, 21:14
von DasIch
kryz hat geschrieben:aber da wird es doch wohl eine einfachere und schönere lösung zum problem geben?
datetime benutzen.

Es ist übrigens beeindruckend wieviele absolute no-gos dein Code enthält dafür dass er nur 38 Zeilen lang ist.

Du solltest auf jedenfall ein Python Tutorial zu rate ziehen (damit ist nicht das Openbook gemeint) und dich mit PEP 8 sowie idiomatischem Python auseinandersetzen.

Re: sekunden in grössere zeiteinheiten umrechnen

Verfasst: Freitag 20. März 2009, 22:36
von gerold
Hallo kryz!

Bitte selber nachprüfen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import datetime


def zeitspanne(sekunden):
    """
    Gibt die Zeitspanne als Tuppel zurück
    
    @return: (wochen, tage, stunden, minuten, sekunden)
    """
    
    delta = datetime.timedelta(seconds = sekunden)
    delta_str = str(delta)[-8:] # z.B: " 1:01:01"
    hours, minutes, seconds = [ int(val) for val in delta_str.split(":", 3) ]
    weeks = delta.days // 7
    days = delta.days % 7
    
    return weeks, days, hours, minutes, seconds


def zeitspanne_variante2(seconds):
    """
    Gibt die Zeitspanne als Tuppel zurück
    
    @return: (wochen, tage, stunden, minuten, sekunden)
    """
    
    WEEK = 60 * 60 * 24 * 7
    DAY = 60 * 60 * 24
    HOUR = 60 * 60
    MINUTE = 60
    
    weeks = seconds // WEEK
    seconds = seconds % WEEK
    days = seconds // DAY
    seconds = seconds % DAY
    hours = seconds // HOUR
    seconds = seconds % HOUR
    minutes = seconds // MINUTE
    seconds = seconds % MINUTE
    
    return weeks, days, hours, minutes, seconds
    

def main():
    print zeitspanne(1234567)
    print zeitspanne_variante2(1234567)


if __name__ == "__main__":
    main()
mfg
Gerold
:-)

Verfasst: Freitag 20. März 2009, 23:07
von birkenfeld
Das könnte man mit divmod() noch etwas vereinfachen.

Verfasst: Freitag 20. März 2009, 23:14
von gerold
birkenfeld hat geschrieben:Das könnte man mit divmod() noch etwas vereinfachen.
Hallo birkenfeld!

Danke! Genau nach diesem Befehl habe ich die Doku mindestens drei Minuten lang durchsucht. :-) Der genaue Name ist mir nicht mehr eingefallen.

http://paste.pocoo.org/show/108868/

lg
Gerold
:-)

Verfasst: Sonntag 22. März 2009, 18:41
von derdon

Verfasst: Sonntag 22. März 2009, 19:43
von EyDu

Code: Alles auswählen

MINUTE = 60
HOUR = 60 * MINUTE
DAY = 24 * HOUR
WEEK = 7 * DAY

Verfasst: Sonntag 22. März 2009, 19:49
von derdon
Ja, ``a * b`` ist viel besser als ``b * a``

Verfasst: Sonntag 22. März 2009, 23:28
von kryz
danke für eure antworten.

anscheinend gibts da wirklich keine lösung in der standardbibliothek. wenn man den einfachen, kurzen code von gerolds zeitspanne_variante2 anschaut, brauchts das allerdings auch nicht wirklich ;)

ich habe trozdem meinen code noch ein bisschen verbessert und versucht, die absoluten no-gos zu eliminieren. ist halt ein stück länger, dafür gibts die möglichkeit die grösste zeiteinheit zu bestimmen. http://paste.pocoo.org/show/109119/

Verfasst: Sonntag 22. März 2009, 23:37
von derdon
kryz hat geschrieben:ich habe trozdem meinen code noch ein bisschen verbessert und versucht, die absoluten no-gos zu eliminieren.
Zu den absoluten no-gos gehört auch: sich nicht an PEP8 halten. Du musst nicht eine Instanz der Klasse PrettyPrinter erzeugen; die Funktion pprint aus dem Modul pprint reicht doch auch. Die Funktion lässt sich auf jeden Fall in weniger Zeilen schreiben.