C'est la meilleure façon, à mon humble avis, car vous pouvez ensuite utiliser l'arithmétique sur le timedelta et tous les objets datetime.
Matthew Schinckel
13
Cela fonctionne pendant plusieurs jours: str(datetime.timedelta(seconds=60*60*24+1))='1 day, 0:00:01'
hyprnick
3
str(datetime.timedelta(seconds=round(666666.55)))rend correctement les jours; supprime les secondes décimales.
CPBL
1
timedeltan'est pas sûr de débordement et ne peut pas effectuer correctement les opérations mathématiques, par exemple str(timedelta(hours=8) - timedelta(hours=10))le résultat est '-1 day, 22:00:00'et la solution basée sur des nombres entiers est exactement pour les situations où vous en avez besoin '-02:00:00'.
cprn
1
+1. Cette réponse peut être modifiée très facilement. Par exemple, si vous souhaitez omettre un champ lors de l'impression, utilisez ceci: stackoverflow.com/questions/7999935/…
eric_kernfeld
616
En utilisant la divmod()fonction, qui ne fait qu'une seule division pour produire à la fois le quotient et le reste, vous pouvez obtenir le résultat très rapidement avec seulement deux opérations mathématiques:
Si vous préférez les opérateurs aux fonctions, utilisez le modulo; par exemple (seulement minutes / secondes):'%d:%02dmn' % (seconds / 60, seconds % 60)
bufh
18
Et vous pouvez l' étendre à jour: d, h = divmod(h, 24).
Mark Ransom
14
@MarkRansom: puis aux mois m, d = divmod(m, 31). Oups, non, vous ne pouvez pas. Pire encore, votre code sera erroné si des secondes intercalaires entrent en jeu. Pour faire court: utilisez timedeltale calendrier et ne le dérangez pas, il vous mordra.
4
@Tibo gère timedeltales secondes intercalaires ? Je suppose que non. Il existe de nombreuses applications où ce calcul simple est plus que suffisant.
Mark Ransom
1
@MarkRansom str(timedelta(hours=8) - timedelta(hours=10))le résultat est '-1 jour, 22:00:00' donc ... idk s'il fonctionne avec des secondes intercalaires mais ne fonctionne pas avec des nombres négatifs.
cprn
70
Je peux difficilement nommer cela d'une manière facile (au moins je ne me souviens pas de la syntaxe), mais il est possible d'utiliser time.strftime , qui donne plus de contrôle sur le formatage:
from time import strftime
from time import gmtime
strftime("%H:%M:%S", gmtime(666))'00:11:06'
strftime("%H:%M:%S", gmtime(60*60*24))'00:00:00'
gmtime est utilisé pour convertir les secondes en un format de tuple spécial qui le strftime()requiert.
Malheureusement, cette méthode commence à mesurer les jours à partir de 1, elle n'est donc pas conçue pour représenter le delta de temps, et c'est donc un accident qui attend. Par exemple avec time.strftime('%d %H:%M:%S', time.gmtime(1))=> '1 jour, 0:00:01'.
from time import gmtime
from time import strftime
# NOTE: The following resets if it goes over 23:59:59!
strftime("%H:%M:%S", gmtime(125))# Result: '00:02:05'
strftime("%H:%M:%S", gmtime(60*60*24-1))# Result: '23:59:59'
strftime("%H:%M:%S", gmtime(60*60*24))# Result: '00:00:00'
strftime("%H:%M:%S", gmtime(666777))# Result: '17:12:57'# Wrong
il échoue si le delta est inférieur à une seconde:"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
jfs
1
Pour tout le monde: dans l' without ':0>8':exemple, il manque un 0. {:0>8}zéro zéro en tête pour les 8 zéros à gauche.
TankorSmash
2
En python 3.5.2, j'obtiens une TypeError. Je formate une time.time()-startvariable. Un aperçu? TypeError: non-empty format string passed to object.__format__
medley56
J'ai essayé d'utiliser datetime.now()au lieu de time.time()pour générer mon objet timedelta et j'obtiens la même erreur.
medley56
@ medley56 Lorsque vous utilisez python3, vous devez utiliser str()si vous allez utiliser un format tel que 0>8: "{:0>8}".format(str(datetime.timedelta(seconds=666777))). Vérifiez cette réponse pour plus d'informations.
Berriel
22
Voici ma petite astuce:
from humanfriendly import format_timespan
secondsPassed =1302
format_timespan(secondsPassed)# '21 minutes and 42 seconds'
Au lieu de cela, 1vous pouvez utiliser n'importe quel nombre supérieur à 0. Ici, nous utilisons le fait que datetime.fromordinalretournera toujours un datetimeobjet avec un timecomposant égal à zéro.
def sec2time(sec, n_msec=3):''' Convert seconds to 'D days, HH:MM:SS.FFF' '''if hasattr(sec,'__len__'):return[sec2time(s)for s in sec]
m, s = divmod(sec,60)
h, m = divmod(m,60)
d, h = divmod(h,24)if n_msec >0:
pattern ='%%02d:%%02d:%%0%d.%df'%(n_msec+3, n_msec)else:
pattern = r'%02d:%02d:%02d'if d ==0:return pattern %(h, m, s)return('%d days, '+ pattern)%(d, h, m, s)
dateutil.relativedeltaest pratique si vous devez également accéder aux heures, minutes et secondes sous forme de flotteurs. datetime.timedeltane fournit pas une interface similaire.
from dateutil.relativedelta import relativedelta
rt = relativedelta(seconds=5440)print(rt.seconds)print('{:02d}:{:02d}:{:02d}'.format(
int(rt.hours), int(rt.minutes), int(rt.seconds)))
Je reçois une sortie différente de la vôtre, ce qui me fait penser que vous avez une faute de frappe. Vous vouliez probablement utiliser à la seconds=5440place de seconds=5540. J'aime bien ta réponse!
JL
2
heures (h) calculées par division du plancher (par //) de secondes par 3600 (60 min / h * 60 sec / min)
minutes (m) calculées par division au sol des secondes restantes (reste du calcul des heures, en%) par 60 (60 sec / min)
de même, secondes (s) par le reste du calcul des heures et des minutes.
Le reste n'est qu'un formatage de chaîne!
def hms(seconds):
h = seconds //3600
m = seconds %3600//60
s = seconds %3600%60return'{:02d}:{:02d}:{:02d}'.format(h, m, s)print(hms(7500))# Should print 02h05m00s
Bien que ce code puisse fournir une solution à la question du PO, il est préférable d'ajouter du contexte pour expliquer pourquoi / comment cela fonctionne. Cela peut aider les futurs utilisateurs à apprendre et à appliquer ces connaissances à leur propre code. Vous êtes également susceptible d'avoir des commentaires positifs des utilisateurs sous la forme de votes positifs, lorsque le code est expliqué.
borchvm
2
Je viens de le faire, merci @borchvm de l'avoir signalé!
Sam
-2
Vous pouvez diviser les secondes par 60 pour obtenir les minutes
import time
seconds = time.time()
minutes = seconds /60print(minutes)
Lorsque vous le divisez à nouveau par 60, vous obtiendrez les heures
Réponses:
Vous pouvez utiliser la
datetime.timedelta
fonction:la source
str(datetime.timedelta(seconds=60*60*24+1))
='1 day, 0:00:01'
str(datetime.timedelta(seconds=round(666666.55)))
rend correctement les jours; supprime les secondes décimales.timedelta
n'est pas sûr de débordement et ne peut pas effectuer correctement les opérations mathématiques, par exemplestr(timedelta(hours=8) - timedelta(hours=10))
le résultat est'-1 day, 22:00:00'
et la solution basée sur des nombres entiers est exactement pour les situations où vous en avez besoin'-02:00:00'
.En utilisant la
divmod()
fonction, qui ne fait qu'une seule division pour produire à la fois le quotient et le reste, vous pouvez obtenir le résultat très rapidement avec seulement deux opérations mathématiques:Et puis utilisez le formatage de chaîne pour convertir le résultat en sortie souhaitée:
la source
'%d:%02dmn' % (seconds / 60, seconds % 60)
d, h = divmod(h, 24)
.m, d = divmod(m, 31)
. Oups, non, vous ne pouvez pas. Pire encore, votre code sera erroné si des secondes intercalaires entrent en jeu. Pour faire court: utiliseztimedelta
le calendrier et ne le dérangez pas, il vous mordra.timedelta
les secondes intercalaires ? Je suppose que non. Il existe de nombreuses applications où ce calcul simple est plus que suffisant.str(timedelta(hours=8) - timedelta(hours=10))
le résultat est '-1 jour, 22:00:00' donc ... idk s'il fonctionne avec des secondes intercalaires mais ne fonctionne pas avec des nombres négatifs.Je peux difficilement nommer cela d'une manière facile (au moins je ne me souviens pas de la syntaxe), mais il est possible d'utiliser time.strftime , qui donne plus de contrôle sur le formatage:
gmtime est utilisé pour convertir les secondes en un format de tuple spécial qui le
strftime()
requiert.la source
time.strftime('%d %H:%M:%S', time.gmtime(1))
=> '1 jour, 0:00:01'.En utilisant
datetime
:Au
':0>8'
format:Sans le
':0>8'
format:En utilisant
time
:la source
"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
without ':0>8':
exemple, il manque un 0.{:0>8}
zéro zéro en tête pour les 8 zéros à gauche.time.time()-start
variable. Un aperçu?TypeError: non-empty format string passed to object.__format__
datetime.now()
au lieu detime.time()
pour générer mon objet timedelta et j'obtiens la même erreur.str()
si vous allez utiliser un format tel que0>8
:"{:0>8}".format(str(datetime.timedelta(seconds=666777)))
. Vérifiez cette réponse pour plus d'informations.Voici ma petite astuce:
Pour plus d'informations, visitez: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan
la source
Si vous avez besoin d'obtenir de la
datetime.time
valeur, vous pouvez utiliser cette astuce:Vous ne pouvez pas ajouter
timedelta
àtime
, mais pouvez l'ajouter àdatetime
.UPD : Encore une autre variante de la même technique:
Au lieu de cela,
1
vous pouvez utiliser n'importe quel nombre supérieur à 0. Ici, nous utilisons le fait quedatetime.fromordinal
retournera toujours undatetime
objet avec untime
composant égal à zéro.la source
Voilà comment je l'ai obtenu.
Quelques exemples:
la source
str(datetime.timedelta(seconds=666))
666.0
et les666.1
valeurs.L'ensemble suivant a fonctionné pour moi.
la source
dateutil.relativedelta
est pratique si vous devez également accéder aux heures, minutes et secondes sous forme de flotteurs.datetime.timedelta
ne fournit pas une interface similaire.Impressions
la source
seconds=5440
place deseconds=5540
. J'aime bien ta réponse!heures (h) calculées par division du plancher (par //) de secondes par 3600 (60 min / h * 60 sec / min)
minutes (m) calculées par division au sol des secondes restantes (reste du calcul des heures, en%) par 60 (60 sec / min)
de même, secondes (s) par le reste du calcul des heures et des minutes.
Le reste n'est qu'un formatage de chaîne!
la source
Vous pouvez diviser les secondes par 60 pour obtenir les minutes
Lorsque vous le divisez à nouveau par 60, vous obtiendrez les heures
la source
PS Mon code n'est pas professionnel
la source