2013-04-19 11 views
13

Mam ramkę danych w pandach o nazwie "munged_data" z dwiema kolumnami "entry_date" i "dob", które przekonwertowałem na znaczniki czasu przy użyciu pd.to_timestamp. Próbuję obliczyć, jak obliczyć wiek ludzi na podstawie różnicy czasu między "entry_date" i "dob" i aby to zrobić muszę uzyskać różnicę w dniach między dwiema kolumnami (tak, że mogę wtedy zrobić coś w rodzaju rundy (dni/365.25). . być w stanie znaleźć sposób, aby to zrobić za pomocą vectorized operację Kiedy zrobić munged_data.entry_date-munged_data.dob otrzymuję następujący:Panda Timedelta w dniach

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 

jednak nie wydaje się, aby móc wyodrębnić dni jako liczba całkowita, dzięki czemu mogę kontynuować obliczeniaKażda pomoc doceniona.

Odpowiedz

10

Trzeba 0,11 (0.11rc1 za to jest obecnie, ostateczna prob przyszłym tygodniu)

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 

Trzeba to dziwne zastosowanie pod koniec, bo jeszcze nie pełne wsparcie dla timedelta64 [NS] skalary (np jak jak używamy znaczników czasu teraz datetime64 [nS], w najbliższych 0,12)

+0

Bardzo dziękuję Jeffowi, że nie znałem metody item(). Udało mi się to zrobić z 0,10 – luckyfool

+0

świetnie! Oto kilka przepisów i link do nowych dokumentów (w 0.11), http://pandas.pydata.org/pandas-docs/dev/cookbook.html#miscellaneous – Jeff

10

Nie jestem pewien, czy nadal go potrzebujemy, ale w pand 0,14 zwykle używam .astype („timedelta64 [X]”) metoda http://pandas.pydata.org/pandas-docs/stable/timeseries.html (konwersja częstotliwości)

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

Powroty:

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

Powroty:

0 -4 
dtype: float64 

nadzieję, że pomogą

+1

To działało świetnie. Zmieniłem 'D' na' Y', aby uzyskać dni. – fantabolous

+0

Po prostu wylogowałem się i znalazłem to pytanie. Mój problem polega na tym, że używałem czegoś podobnego do odpowiedzi Jeffa na moją ramkę danych. Jednak mam milion linii, więc stosowanie jest powolne. Użycie '.astype ('timedelta64 [D]')' jest szybszą metodą (około 200x) –

21

Korzystanie pandy typ Timedelta dostępny od v0.15.0 można również zrobić :

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

Aby przekonwertować dowolny typ danych na dni wystarczy użyć timedelta() dni.

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

Niech określić, że masz serii pandy imieniem time_difference który ma typ numpy.timedelta64 [ns]

Jednym ze sposobów wydobywania tylko dni (lub inny pożądany atrybut) jest następujący:

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

Ta funkcja jest używana, ponieważ obiekt numpy.timedelta64 nie ma atrybutu "days".