web-dev-qa-db-fra.com

Python: convertir les secondes en hh: mm: ss

Comment convertir un int (nombre de secondes) dans ces formats: mm: ss ou hh: mm: ss

Je dois le faire avec du code Python (et si possible dans un modèle Django?).

Merci beaucoup ;-)

49
user166648

Je ne peux pas croire que l’une des nombreuses réponses donne ce que j’appellerais un "moyen évident de le faire" (et je ne suis même pas néerlandais ...! -) - jusqu’à un peu moins de 24 heures de secondes (86399 secondes, en particulier):

>>> import time
>>> time.strftime('%H:%M:%S', time.gmtime(12345))
'03:25:45'

Le faire dans un modèle Django est plus astucieux, puisque le filtre time prend en charge une syntaxe de formatage de temps funky (inspiré, je crois, de PHP), et nécessite également le module datetime et une implémentation de fuseau horaire tel que pytz pour préparer les données. Par exemple:

>>> from Django import template as tt
>>> import pytz
>>> import datetime
>>> tt.Template('{{ x|time:"H:i:s" }}').render(
...     tt.Context({'x': datetime.datetime.fromtimestamp(12345, pytz.utc)}))
u'03:25:45'

En fonction de vos besoins, il peut être plus pratique de définir un filtre personnalisé pour cette tâche de mise en forme dans votre application.

105
Alex Martelli
>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'
61
SilentGhost

Code qui fait ce qui a été demandé, avec des exemples, et montre comment les cas qu'il n'a pas spécifiés sont traités:

def format_seconds_to_hhmmss(seconds):
    hours = seconds // (60*60)
    seconds %= (60*60)
    minutes = seconds // 60
    seconds %= 60
    return "%02i:%02i:%02i" % (hours, minutes, seconds)

def format_seconds_to_mmss(seconds):
    minutes = seconds // 60
    seconds %= 60
    return "%02i:%02i" % (minutes, seconds)

minutes = 60
hours = 60*60
assert format_seconds_to_mmss(7*minutes + 30) == "07:30"
assert format_seconds_to_mmss(15*minutes + 30) == "15:30"
assert format_seconds_to_mmss(1000*minutes + 30) == "1000:30"

assert format_seconds_to_hhmmss(2*hours + 15*minutes + 30) == "02:15:30"
assert format_seconds_to_hhmmss(11*hours + 15*minutes + 30) == "11:15:30"
assert format_seconds_to_hhmmss(99*hours + 15*minutes + 30) == "99:15:30"
assert format_seconds_to_hhmmss(500*hours + 15*minutes + 30) == "500:15:30"

Vous pouvez - et devriez probablement - le stocker sous forme de timedelta plutôt que d'int, mais c'est un problème distinct et timedelta ne facilite pas réellement cette tâche particulière.

20
Glenn Maynard

Avez-vous lu le module datetime ?

Edit/update: La réponse de SilentGhost contient les détails que ma réponse laisse de côté. Si vous aimez cette réponse, +1 lui aussi (ou à la place). Republié ici:

>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'
10
Matt Howell

Si vous utilisez divmod, vous êtes immunisé contre différents types de division de nombres entiers:

# show time strings for 3800 seconds

# easy way to get mm:ss
print "%02d:%02d" % divmod(3800, 60)

# easy way to get hh:mm:ss
print "%02d:%02d:%02d" % \
    reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
        [(3800,),60,60])


# function to convert floating point number of seconds to 
# hh:mm:ss.sss
def secondsToStr(t):
    return "%02d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

print secondsToStr(3800.123)

Impressions:

63:20
01:03:20
01:03:20.123
7
PaulMcG

Vous pouvez calculer le nombre de minutes et d’heures à partir du nombre de secondes par simple division:

seconds = 12345
minutes = seconds // 60
hours = minutes // 60

print "%02d:%02d:%02d" % (hours, minutes % 60, seconds % 60)
print "%02d:%02d" % (minutes, seconds % 60)

Ici, // est une division entière en pythons.

7
sth

Faites attention en divisant par 60: la division entre les entiers renvoie un entier -> 12/60 = 0 sauf si vous importez la division de future . Ce qui suit est copié et collé depuis Python 2.6.2:

IDLE 2.6.2      
>>> 12/60
0
>>> from __future__ import division
>>> 12/60
0.20000000000000001
1
Francesco

Outre le fait que Python prend en charge les dates et les heures (voir la réponse de bigmattyh), il est facile de trouver des minutes ou des heures à partir de secondes:

minutes = seconds / 60
hours = minutes / 60

Maintenant, lorsque vous souhaitez afficher les minutes ou les secondes, modifiez-les de 60 pour qu'ils ne soient pas supérieurs à 59.

0
Ed S.

N'étant pas une personne python mais plus simple sans aucune bibliothèque, simplement:

total   = 3800
seconds = total % 60
total   = total - seconds
hours   = total / 3600
total   = total - (hours * 3600)
mins    = total / 60

Code mis à jour, merci qc

0
gaqzi

Si vous devez le faire souvent, vous pouvez précalculer toutes les chaînes possibles en nombre de secondes dans une journée:

try:
    from itertools import product
except ImportError:
    def product(*seqs):
        if len(seqs) == 2:
            for s1 in seqs[0]:
                for s2 in seqs[1]:
                    yield (s1,s2)
        else:
            for s in seqs[0]:
                for p in product(*seqs[1:]):
                    yield (s,) + p

hhmmss = {}
i = 0
for (h,m,s) in product(range(24),range(60),range(60)):
    hhmmss[i] = "%02d:%02d:%02d" % (h,m,s)
    i += 1

Maintenant, la conversion de secondes au format chaîne est une recherche rapide dans le dict:

print hhmmss[12345]

empreintes

'03:25:45'
0
PaulMcG