Быстрое внедрение приращения дат по дням в соответствии с другим столбцом панды - PullRequest
0 голосов
/ 09 января 2019

У меня есть следующие панды DF:

print(df.to_dict())
{'Date_Installed': {11885: Timestamp('2018-11-15 00:00:00'), 111885: Timestamp('2018-11-15 00:00:00')}, 'days_from_instalation': {11885: 2, 111885: 3}}

Я хотел бы создать новый столбец, который увеличивает столбец 'Date_Installed' по дням из столбца 'days_from_instalation'

Я знаю, что это возможно при использовании метода apply() следующим образом:

from datetime import timedelta
df['desired_date']=df.apply(lambda row:row['Date_Installed']+timedelta(row['days_from_instalation']), axis=1)

, который выдает желаемый результат:

print(df.to_dict())

{'Date_Installed': {11885: Timestamp('2018-11-15 00:00:00'), 111885: Timestamp('2018-11-15 00:00:00')}, 'days_from_instalation': {11885: 2, 111885: 3}, 'desired_date': {11885: Timestamp('2018-11-17 00:00:00'), 111885: Timestamp('2018-11-18 00:00:00')}}

Однако этот метод очень медленный, и его невозможно применить к моему полному DF.

У меня не было нескольких вопросов об увеличении дат в пандах, как этот:

панды инкремент-DateTime

Но все они, похоже, имеют дело с постоянным приращением, без какого-либо векторизованного метода.

Есть ли векторизованная версия этого типа приращения?

Заранее спасибо!

1 Ответ

0 голосов
/ 09 января 2019

Добавить timedeltas, созданные to_timedelta:

df['desired_date'] = df['Date_Installed'] +
                        pd.to_timedelta(df['days_from_instalation'], unit='d')

print (df)
       Date_Installed  days_from_instalation desired_date
11885      2018-11-15                      2   2018-11-17
111885     2018-11-15                      3   2018-11-18

Другое решение для numpy работает быстрее, но потеряет часовые пояса (если указан):

a = pd.to_timedelta(df['days_from_instalation'], unit='d').values.astype(np.int64)
df['desired_date1'] = pd.to_datetime(df['Date_Installed'].values.astype(np.int64)+a, unit='ns')

Производительность :

#20krows
df = pd.concat([df] * 10000, ignore_index=True)

In [217]: %timeit df['desired_date1'] = pd.to_datetime(df['Date_Installed'].values.astype(np.int64) + pd.to_timedelta(df['days_from_instalation'], unit='d').values.astype(np.int64), unit='ns')
886 µs ± 9.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [218]: %timeit df['desired_date'] = df['Date_Installed'] + pd.to_timedelta(df['days_from_instalation'], unit='d')
1.53 ms ± 82.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...