sekunden in grössere zeiteinheiten umrechnen

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
kryz
User
Beiträge: 12
Registriert: Sonntag 3. Februar 2008, 16:55

Freitag 20. März 2009, 20:57

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?
DasIch
User
Beiträge: 2480
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Freitag 20. März 2009, 21:14

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 20. März 2009, 22:36

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 20. März 2009, 23:07

Das könnte man mit divmod() noch etwas vereinfachen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 20. März 2009, 23:14

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Sonntag 22. März 2009, 18:41

EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sonntag 22. März 2009, 19:43

Code: Alles auswählen

MINUTE = 60
HOUR = 60 * MINUTE
DAY = 24 * HOUR
WEEK = 7 * DAY
Das Leben ist wie ein Tennisball.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Sonntag 22. März 2009, 19:49

Ja, ``a * b`` ist viel besser als ``b * a``
kryz
User
Beiträge: 12
Registriert: Sonntag 3. Februar 2008, 16:55

Sonntag 22. März 2009, 23:28

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/
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Sonntag 22. März 2009, 23:37

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.
Antworten