2012-04-26 5 views
9

che sto cercando di fare alcuni calcoli sulla data, ho un oggetto timedelta, e voglio ottenere il numero di secondi. Sembra che dt.total_seconds() faccia esattamente ciò di cui ho bisogno, ma sfortunatamente è stato introdotto in Python 2.7 e sono bloccato con una versione precedente.total_seconds Computing in Python per il modulo datetime con la vera divisione abilitati

Se leggo the official documentation, si afferma quanto segue:

restituire il numero totale di secondi contenute nella durata. Equivalente a (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6)/10 ** 6 calcolata con vera divisione abilitato.

E dopo guardando il sorgente del modulo datetime (in C), vedo qualcosa di simile:

total_seconds = PyNumber_TrueDivide(total_microseconds, one_million); 

Così, mentre il calcolo di total_seconds() sembra banale, che mi lascia chiedendo cosa questo vera divisione significa in realtà. Non sono riuscito a trovare alcuna informazione sull'argomento. Cosa succede se uso solo una divisione regolare, perché abbiamo bisogno di questa vera divisione e cosa fa? Posso semplicemente scrivere total_seconds() in Python con l'equivalente indicato nel documento?

+2

+1 Grande domanda! I documenti dovrebbero probabilmente essere più chiari su questo punto. – katrielalex

+0

-1 Cattiva domanda. "Non sono riuscito a trovare alcuna informazione sull'argomento" è BS. Google ("python vera divisione") –

+0

@JohnMachin Questo non cambia il fatto che il documento non è chiara su questo argomento. Grazie per il tuo commento costruttivo. –

risposta

10

Con vera divisione, 1/2 si tradurrebbe in 0.5. Il comportamento predefinito in Python 2.x è usare divisione intera, dove 1/2 comporterebbe 0. Ecco la spiegazione da docs:

divisione intera semplice o lungo produce un numero intero dello stesso tipo; il risultato è quello della divisione matematica con la funzione 'floor' applicata al risultato.

di consentire una vera divisione su Python 2.2 o superiore (non è necessario su Python 3.x), è possibile utilizzare il seguente:

from __future__ import division 

In alternativa, si può semplicemente fare uno degli argomenti un galleggiante per ottenere lo stesso comportamento:

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/10.0**6 
+0

Spiegazione chiara e concisa, grazie! –

0

il modo più semplice per fare questo, quando si utilizza i numeri nel codice in ogni caso è quello di utilizzare un galleggiante sulla prima divisione.

Se si utilizza 10.0 ** 6, il risultato sarà un valore float, il che significa che tutti gli altri numeri nella formula saranno anch'essi a virgola mobile, il che porta a "vera divisione".

Problemi correlati