Ho una funzione che restituisce informazioni in pochi secondi, ma ho bisogno di memorizzarle in ore: minuti: secondi.
C'è un modo semplice per convertire i secondi in questo formato in Python?
Ho una funzione che restituisce informazioni in pochi secondi, ma ho bisogno di memorizzarle in ore: minuti: secondi.
C'è un modo semplice per convertire i secondi in questo formato in Python?
Risposte:
Puoi usare la datetime.timedeltafunzione:
>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
str(datetime.timedelta(seconds=60*60*24+1))='1 day, 0:00:01'
str(datetime.timedelta(seconds=round(666666.55)))rende correttamente i giorni; sopprime i secondi decimali.
timedeltanon è troppo sicuro e non può eseguire correttamente operazioni matematiche, ad esempio str(timedelta(hours=8) - timedelta(hours=10))il risultato è '-1 day, 22:00:00'e la soluzione basata su numeri interi è esattamente per quelle situazioni in cui è necessario '-02:00:00'.
Usando la divmod()funzione, che fa una sola divisione per produrre sia il quoziente che il resto, puoi ottenere il risultato molto rapidamente con solo due operazioni matematiche:
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
Quindi utilizzare la formattazione di stringa per convertire il risultato nell'output desiderato:
print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+
'%d:%02dmn' % (seconds / 60, seconds % 60)
d, h = divmod(h, 24).
m, d = divmod(m, 31). Oooops, no, non puoi. Peggio ancora, il tuo codice sarà sbagliato se entrano in gioco secondi saltati. Per timedeltafarla breve: usa e non scherzare con il calendario, ti morderà.
timedeltaoccupa dei secondi bisestili? Sospetto di no. Ci sono molte applicazioni in cui questa semplice matematica è più che sufficiente.
str(timedelta(hours=8) - timedelta(hours=10))il risultato è '-1 giorno, 22:00:00' quindi ... idk se funziona con secondi saltati ma non funziona con numeri negativi.
Riesco a malapena a nominarlo in modo semplice (almeno non ricordo la sintassi), ma è possibile usare time.strftime , che offre un maggiore controllo sulla formattazione:
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 è usato per convertire i secondi in uno speciale formato di tupla che strftime()richiede.
Nota: tronca dopo le 23:59:59
time.strftime('%d %H:%M:%S', time.gmtime(1))=> '1 giorno, 0:00:01'.
datetime:':0>8'formato:from datetime import timedelta
"{:0>8}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{:0>8}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{:0>8}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
':0>8'formato:"{}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
time: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
"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
without ':0>8':nell'esempio mancano i 0. {:0>8}zero pad iniziali agli 8 zero di sinistra.
time.time()-startvariabile. Qualche idea? TypeError: non-empty format string passed to object.__format__
datetime.now()invece di time.time()generare il mio oggetto timedelta e ottengo lo stesso errore.
str()se si sta andando utilizzare un formato come 0>8: "{:0>8}".format(str(datetime.timedelta(seconds=666777))). Controlla questa risposta per maggiori informazioni.
Questo è il mio trucco rapido:
from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'
Per maggiori informazioni Visita: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan
Se hai bisogno di ottenere datetime.timevalore, puoi usare questo trucco:
my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()
Non puoi aggiungere timedeltaa time, ma puoi aggiungerlo a datetime.
UPD : Ancora un'altra variante della stessa tecnica:
my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()
Invece di 1te puoi usare qualsiasi numero maggiore di 0. Qui usiamo il fatto che datetime.fromordinalrestituirà sempre l' datetimeoggetto con timecomponente pari a zero.
Ecco come l'ho preso.
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)
Qualche esempio:
$ sec2time(10, 3)
Out: '00:00:10.000'
$ sec2time(1234567.8910, 0)
Out: '14 days, 06:56:07'
$ sec2time(1234567.8910, 4)
Out: '14 days, 06:56:07.8910'
$ sec2time([12, 345678.9], 3)
Out: ['00:00:12.000', '4 days, 00:01:18.900']
str(datetime.timedelta(seconds=666))
666.0e 666.1valori.
Il seguente set ha funzionato per me.
def sec_to_hours(seconds):
a=str(seconds//3600)
b=str((seconds%3600)//60)
c=str((seconds%3600)%60)
d=["{} hours {} mins {} seconds".format(a, b, c)]
return d
print(sec_to_hours(10000))
# ['2 hours 46 mins 40 seconds']
print(sec_to_hours(60*60*24+105))
# ['24 hours 1 mins 45 seconds']
dateutil.relativedeltaè utile se è necessario accedere a ore, minuti e secondi anche come float. datetime.timedeltanon fornisce un'interfaccia simile.
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)))
stampe
40.0
01:30:40
seconds=5440invece di seconds=5540. Mi piace la tua risposta, però!
ore (h) calcolate per divisione del pavimento (per //) di secondi per 3600 (60 min / ora * 60 sec / min)
minuti (m) calcolati per divisione del pavimento dei secondi rimanenti (resto dal calcolo dell'ora, per%) per 60 (60 sec / min)
allo stesso modo, i secondi per il resto del calcolo delle ore e dei minuti.
Il resto è solo la formattazione delle stringhe!
def hms(seconds):
h = seconds // 3600
m = seconds % 3600 // 60
s = seconds % 3600 % 60
return '{:02d}:{:02d}:{:02d}'.format(h, m, s)
print(hms(7500)) # Should print 02h05m00s
division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes
PS Il mio codice non è professionale