Capire il timedelta


90

Dato il codice Python di seguito, aiutami a capire cosa sta succedendo lì.

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

Quindi ho capito la differenza tra start timeeend time , alla riga 5 arrotondo la durata lanciando e cosa ora, qual è l'ulteriore spiegazione?

So cosa significa delta (media o differenza), ma perché devo passare seconds = uptimea timedeltae perché la fusione delle corde funziona così bene che ottengo HH:MM:SS?

Risposte:


114

Perché timedelta è definito come:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

Tutti gli argomenti sono facoltativi e il valore predefinito è 0.

Puoi facilmente dire "Tre giorni e quattro millisecondi" con argomenti opzionali in questo modo.

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

E per lo str casting, restituisce un bel valore formattato invece di __repr__migliorare la leggibilità. Dai documenti:

str (t) Restituisce una stringa nella forma [G giorno [s],] [H] H: MM: SS [.UUUUUU], dove D è negativo per t negativo. (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

Documentazione di checkout:

http://docs.python.org/library/datetime.html#timedelta-objects


13

perché devo passare secondi = uptime a timedelta

Poiché agli oggetti timedelta possono essere passati secondi, millisecondi, giorni, ecc ... quindi è necessario specificare cosa si sta passando (questo è il motivo per cui si utilizza la chiave esplicita). Il typecasting intè superfluo in quanto potrebbero anche accettare float.

e perché la fusione degli archi funziona così bene che ottengo HH: MM: SS?

Non è il typecasting che formatta, è il __str__metodo interno dell'oggetto. Infatti otterrai lo stesso risultato se scrivi:

print datetime.timedelta(seconds=int(uptime))

1
Hai accennato a questo, ma vale la pena notare esplicitamente che timedelta fa molto di più che visualizzare le cose nel formato HH: MM: SS. Un oggetto timedelta viene utilizzato ogni volta che è necessario prendere una differenza tra due oggetti datetime.
Wilduck

1
Non è il __repr__metodo, è il __str__metodo.
utdemir

1
Non il __repr__()timedelta, ma il suo __str__()metodo. printti chiama __str()__.
bgporter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.