2013-04-19 2 views
13

У меня есть dataframe в пандах под названием «munged_data» с двумя столбцами «entry_date» и «dob», которые я преобразовал в Timestamps с помощью pd.to_timestamp. Я пытаюсь выяснить, как рассчитать возраст людей основанный на разнице во времени между «entry_date» и «dob», и для этого мне нужно получить разницу в днях между двумя столбцами (чтобы затем я мог делать что-то вроде round (days/365.25). Мне кажется, . быть в состоянии найти способ сделать это, используя векторизованную операцию Когда я munged_data.entry_date-munged_data.dob я получаю следующее:Pandas Timedelta in Days

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 

Однако я, кажется, не быть в состоянии извлечь дни как integer, чтобы я мог продолжить вычисления. Любая помощь приветствуется.

ответ

10

Вам нужно 0.11 для этого (0.11rc1 выходит, окончательные пробы на следующей неделе)

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 

Вам это нужно нечетный применять в конце, потому что еще не полная поддержка timedelta64 [нс] скаляры (например, например, как мы используем теперь отметку время datetime64 [нс], приходя в 0.12)

+0

Спасибо Jeff очень полезно, я не знал, что вы используете метод item(). Мне удалось сделать это с 0.10 – luckyfool

+0

отлично! Вот несколько рецептов и ссылка на новые документы (в 0.11), http://pandas.pydata.org/pandas-docs/dev/cookbook.html#miscellaneous – Jeff

10

Не уверен, что, если вам все еще нужно, но в пандах 0.14 я обычно использую .astype ('timedelta64 [X]) метод http://pandas.pydata.org/pandas-docs/stable/timeseries.html (преобразование частоты)

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

Возвращает:

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

Возвращает:

0 -4 
dtype: float64 

Надежда, которая поможет

+1

Это отлично работает. Я перешел в 'D' для' Y', чтобы получить дни. – fantabolous

+0

Я просто искал Google и нашел этот вопрос. Моя проблема в том, что я использовал что-то похожее, как ответ Джеффа для моего фреймворка. Тем не менее, у меня есть миллион строк, поэтому применять их довольно медленно. Использование '.astype ('timedelta64 [D]')' является способом более быстрого метода (около 200x) –

21

Использование панд типа Timedelta доступна с v0.15.0 вы также можете сделать :

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

Для преобразования данных любого типа в дни просто использовать Timedelta() дней:.

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

Уточним, что у вас есть панды серии под названием time_difference, который имеет тип numpy.timedelta64 [нс]

Один из способов извлечения только на следующий день (или любой другой нужный атрибут) заключается в следующем:

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

Эта функция используется, потому что объект numpy.timedelta64 не имеет атрибута «дней».

Смежные вопросы