Подтвердить что ты не робот

Pandas Timedelta в днях

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

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  

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

4b9b3361

Ответ 1

Для этого вам нужно 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 [ns] (например, как мы используем Timestamps сейчас для datetime64 [ns], начиная с 0.12)

Ответ 2

Используя Pandas тип 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

Ответ 3

Не уверен, что он вам все еще нужен, но в Pandas 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

Надеюсь, что поможет

Ответ 4

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

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

Ответ 5

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

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

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

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