Преобразование timedelta в int очень медленно в python - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть датафрейм с двумя столбцами, каждый из которых состоит из набора дат.Я хочу вычислить разницу между датами и вернуть количество дней.Однако процесс (описанный выше) очень медленный.Кто-нибудь знает, как ускорить процесс?Этот код используется в большом файле, важна скорость.

dfx = pd.DataFrame([[datetime(2014,1,1), datetime(2014,1,10)],[datetime(2014,1,1), datetime(2015,1,10)],[datetime(2013,1,1),  datetime(2014,1,12)]], columns = ['x', 'y'])

enter image description here

dfx['diffx'] = dfx['y']-dfx['x']
dfx['diff'] = dfx['diffx'].apply(lambda x: x.days)
dfx

Конечная цель:

enter image description here

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете найти предельное массовое ускорение, опускающееся до NumPy, в обход издержек, связанных с pd.Series объектами.

См. Также pd.Timestamp и np.datetime64: взаимозаменяемы ли они для выбранных целей? .

# Python 3.6.0, Pandas 0.19.2, NumPy 1.11.3

def days_lambda(dfx):
    return (dfx['y']-dfx['x']).apply(lambda x: x.days)

def days_pd(dfx):
    return (dfx['y']-dfx['x']).dt.days

def days_np(dfx):
    return (dfx['y'].values-dfx['x'].values) / np.timedelta64(1, 'D')

# check results are identical
assert (days_lambda(dfx).values == days_pd(dfx).values).all()
assert (days_lambda(dfx).values == days_np(dfx)).all()

dfx = pd.concat([dfx]*100000)

%timeit days_lambda(dfx)  # 5.02 s per loop
%timeit days_pd(dfx)      # 5.6 s per loop
%timeit days_np(dfx)      # 4.72 ms per loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...