2016-04-12 12 views
5

voglio calcolare la differenza di tempo tra i tempi in un DateTimeIndexdifferenza di tempo di calcolo di DateTimeIndex

import pandas as pd 
p = pd.DatetimeIndex(['1985-11-14', '1985-11-28', '1985-12-14', '1985-12-28'], dtype='datetime64[ns]') 

posso calcolare la differenza di tempo di due volte:

p[1] - p[0] 

Timedelta('14 days 00:00:00') 

Ma p [1:] - p [: - 1] non funziona e fornisce

DatetimeIndex(['1985-12-28'], dtype='datetime64[ns]', freq=None) 

e di un futuro di avvertimento:

FutureWarning: using '-' to provide set differences with datetimelike Indexes is deprecated, use .difference() 

Ogni pensiero su come come posso (facilmente) calcolare la differenza di tempo tra i valori in un DateTimeIndex? E perché funziona per 1 valore, ma non per l'intero DateTimeIndex?

risposta

4

Convertire il DatetimeIndex ad un Series utilizzando to_series() e quindi chiamare diff per calcolare le differenze tra le righe:

In [5]: 
p.to_series().diff() 

Out[5]: 
1985-11-14  NaT 
1985-11-28 14 days 
1985-12-14 16 days 
1985-12-28 14 days 
dtype: timedelta64[ns] 

Per quanto riguarda il motivo per cui non è riuscito, l'operatore - sta tentando di eseguire una differenza di set o un'intersezione tra i vari intervalli di indice, si sta tentando di sottrarre i valori da un intervallo all'altro con uno diff.

quando hai fatto p[1]-p[0] il - sta eseguendo una sottrazione scalare, ma quando si esegue questa operazione su un indice si pensa che sei eseguire un'operazione di serie

+0

Penso che questa sia la risposta completa e la soluzione più semplice. Grazie a tutti per il vostro aiuto. –

0

L'operatore - sta funzionando, semplicemente non sta facendo quello che ti aspetti. Nella seconda situazione agisce per dare la differenza dei due indici datetime, ovvero il valore che è in p[1:] ma non in p[:-1]

Potrebbe esserci una soluzione migliore, ma funzionerebbe per eseguire l'elemento di comando saggio :

[e - k for e,k in zip(p[1:], p[:-1])] 
0

ho usato None per riempire il primo valore differenza, ma Sono sicuro che puoi capire come ti piacerebbe affrontare quel caso.

>>> [None] + [p[n] - p[n-1] for n in range(1, len(p))] 
[None, 
Timedelta('14 days 00:00:00'), 
Timedelta('16 days 00:00:00'), 
Timedelta('14 days 00:00:00')] 

BTW, per ottenere solo la differenza giorno:

[None] + [(p[n] - p[n-1]).days for n in range(1, len(p))] 
[None, 14, 16, 14] 
Problemi correlati