2015-08-05 10 views
9

Ho giocato un po 'per cercare di capire pandas timestamp e timedeltas. Mi piace come si può operare con loro, ma quando si cerca di sottrazione ho trovato questo un po 'strano:Sottrai i timestamp dei panda; valore assoluto

now = pd.Timestamp('now') 
then = now - pd.to_timedelta('1h') 

print (now - then) 
print (then - now) 
print ((now - then).seconds) 
print ((then - now).seconds) 

risultati in:

0 days 01:00:00 
-1 days +23:00:00 
3600 
82800 

a) Come dovrei capire questo comportamento?

b) C'è un modo per avere un valore assoluto della differenza di data e ora, l'equivalente di abs()?

risposta

9

La ragione di questo apparentemente strano comportamento/buggy è che l'attributo .seconds di un timedelta (per pandas.Timedelta, ma questo è ereditato dalla libreria standard di timedelta.timedelta) è molto ambiguo.
Timedelta è memorizzato in 3 parti: giorni, secondi, microsecondi (https://docs.python.org/2/library/datetime.html#timedelta-objects). Quindi lo seconds è la somma di ore, minuti e secondi (in secondi).

Quindi ci sono 2 'strani' cose che possono portare a confusione:

  • Quando avere un timedelta negativo, si ottiene -1 days +23:00:00 invece di -01:00:00. Questo perché solo la parte days può essere negativa. Quindi un tempo negativo verrà sempre definito come un numero negativo di giorni con l'aggiunta di ore o secondi per ottenere il valore corretto. Quindi questo ti dà la parte +23h.
  • I secondi sono la somma di ore, minuti e secondi. Quindi lo +23:00:00 che otteniamo è uguale a 82800 secondi.

Bottomline is, l'attributo .seconds di un timedelta non ti dà la parte secondi né i secondi totali (timedelta convertito in secondi). Quindi, in pratica, penso che non dovresti quasi mai usarlo.

Per ottenere il timedelta in secondi, è possibile utilizzare il metodo total_seconds. Se definisco la differenza negativa su diff = then - now:

In [12]: diff 
Out[12]: Timedelta('-1 days +23:00:00') 

In [13]: diff.seconds 
Out[13]: 82800 

In [14]: diff.total_seconds() 
Out[14]: -3600.0 
+0

Grazie mille. Anche se è chiaro dalla tua risposta, lascerò per chiarezza, per trovare il valore assoluto di una sottrazione di timestamp: abs ((ts1-ts2) .total_seconds) – luna1999

Problemi correlati