2013-04-19 27 views
13

Ho un dataframe in panda chiamato 'munged_data' con due colonne 'entry_date' e 'dob' che ho convertito in Timestamps usando pd.to_timestamp. Sto cercando di capire come calcolare le età delle persone in base alla differenza di tempo tra 'entry_date' e 'dob' e per fare questo ho bisogno di ottenere la differenza in giorni tra le due colonne (in modo che io possa quindi fare qualcosa come round (giorni/365.25). . essere in grado di trovare un modo per farlo utilizzando un'operazione vectorized Quando faccio munged_data.entry_date-munged_data.dob ottengo il seguente:Panda Timedelta in giorni

internal_quote_id 
2     15685977 days, 23:54:30.457856 
3     11651985 days, 23:49:15.359744 
4      9491988 days, 23:39:55.621376 
7      11907004 days, 0:10:30.196224 
9     15282164 days, 23:30:30.196224 
15     15282227 days, 23:50:40.261632 

Tuttavia non mi sembra di essere in grado di estrarre i giorni come un numero intero in modo che possa continuare con il mio calcolo Qualsiasi aiuto apprezzato.

risposta

10

È necessario 0,11 per questo (0.11rc1 è fuori, prob finale la prossima settimana)

In [9]: df = DataFrame([ Timestamp('20010101'), Timestamp('20040601') ]) 

In [10]: df 
Out[10]: 
        0 
0 2001-01-01 00:00:00 
1 2004-06-01 00:00:00 

In [11]: df = DataFrame([ Timestamp('20010101'), 
          Timestamp('20040601') ],columns=['age']) 

In [12]: df 
Out[12]: 
        age 
0 2001-01-01 00:00:00 
1 2004-06-01 00:00:00 

In [13]: df['today'] = Timestamp('20130419') 

In [14]: df['diff'] = df['today']-df['age'] 

In [16]: df['years'] = df['diff'].apply(lambda x: float(x.item().days)/365) 

In [17]: df 
Out[17]: 
        age    today    diff  years 
0 2001-01-01 00:00:00 2013-04-19 00:00:00 4491 days, 00:00:00 12.304110 
1 2004-06-01 00:00:00 2013-04-19 00:00:00 3244 days, 00:00:00 8.887671 

Hai bisogno di questo strano applichi alla fine, perché non è ancora il supporto completo per timedelta64 [NS] scalari (ad esempio come come usiamo Timestamps ora datetime64 [NS], in arrivo 0,12)

+0

Grazie Jeff, molto utile, non sapevo più del metodo item(). Sono riuscito a farlo con 0.10 – luckyfool

+0

fantastico! Ecco alcune ricette e un link ai nuovi documenti (in 0.11), http://pandas.pydata.org/pandas-docs/dev/cookbook.html#miscellaneous – Jeff

10

Non sono sicuro se hai ancora bisogno, ma in Panda 0,14 Io di solito uso .astype (metodo http://pandas.pydata.org/pandas-docs/stable/timeseries.html (conversione di frequenza 'timedelta64 [X]'))

df = pd.DataFrame([ pd.Timestamp('20010101'), pd.Timestamp('20040605') ]) 
df.ix[0]-df.ix[1] 

Returns:

0 -1251 days 
dtype: timedelta64[ns] 
(df.ix[0]-df.ix[1]).astype('timedelta64[Y]') 

Returns:

0 -4 
dtype: float64 

speranza che vi aiuteranno

+1

Questo ha funzionato alla grande. Ho inserito 'D' per' Y' per ottenere giorni. – fantabolous

+0

Ho cercato su Google e ho trovato questa domanda. Il mio problema è che stavo usando qualcosa di simile a Jeff come risposta al mio dataframe. Tuttavia, mi piacciono un milione di righe, quindi applicare è un po 'lento. Usare '.astype ('timedelta64 [D]')' è un metodo più veloce (circa 200x) –

21

Utilizzando i panda tipo Timedelta disponibili dal v0.15.0 si può anche fare :

In[1]: import pandas as pd 
In[2]: df = pd.DataFrame([ pd.Timestamp('20150111'), 
          pd.Timestamp('20150301') ], columns=['date']) 
In[3]: df['today'] = pd.Timestamp('20150315') 
In[4]: df 
Out[4]: 
     date  today 
0 2015-01-11 2015-03-15 
1 2015-03-01 2015-03-15 

In[5]: (df['today'] - df['date']).dt.days 
Out[5]: 
0 63 
1 14 
dtype: int64 
4

per convertire qualsiasi tipo di dati in giorni basta usare timedelta() giorni:.

pd.Timedelta(1985, unit='Y').days 
84494 
5

Diamo specificare che si dispone di una serie panda di nome time_difference che è di tipo numpy.timedelta64 [NS]

Un modo di estrarre solo il giorno (o qualunque attributo desiderato) è la seguente:

just_day = time_difference.apply(lambda x: pd.tslib.Timedelta(x).days) 

Questa funzione viene utilizzata perché l'oggetto numpy.timedelta64 non ha un attributo 'giorni'.

Problemi correlati