#python #pandas #group-by
#питон #панды #группа-по
Вопрос:
Я хочу создать функцию, которая считает дни как целое число между датой и датой, сдвинутой на несколько периодов назад (например, df[‘new_col’] = (df[‘дата’].сдвиг(#периоды)-df[‘дата’]). Переменная даты-datetime64[D]. В качестве примера: df[‘report_date’].shift(39) = ‘2008-09-26’ и df[‘report_date’] = ‘2008-08-18’ и df[‘delta’] = 39.
import pandas as pd from datetime import datetime from datetime import timedelta import datetime as dt dates =pd.Series(np.tile(['2012-08-01','2012-08-15','2012-09-01','2012-08-15'],4)).astype('datetime64[D]') dates2 =pd.Series(np.tile(['2012-08-01','2012-09-01','2012-10-01','2012-11-01'],4)).astype('datetime64[D]') stocks = ['A','A','A','A','G','G','G','G','B','B','B','B','F','F','F','F'] stocks = pd.Series(stocks) df = pd.DataFrame(dict(stocks = stocks, dates = dates,report_date = dates2)).reset_index() df.head() print('df info:',df.info())
Приведенный ниже код является моей последней попыткой создать эту переменную, но код выдает неправильные результаты.
df['delta'] = df.groupby(['stocks','dates'])['report_date'].transform(lambda x: (x.shift(1).rsub(x).dt.days))
Комментарии:
1. Ваш вопрос неясен. Не могли бы вы обновить свой пост с ожидаемым результатом, пожалуйста?
2.
df.groupby(['stocks'])['report_date'].transform(lambda x: (x.shift(1).rsub(x).dt.days))
?
Ответ №1:
Я придумал решение, используя функцию for loop и zip, чтобы просто вычесть каждую пару вот так…
from datetime import datetime import pandas as pd dates = ['2012-08-01', '2012-08-15', '2012-09-01', '2012-08-15'] dates2 = ['2012-08-01', '2012-09-01', '2012-10-01', '2012-11-01'] diff = [] for i, x in zip(dates, dates2): i = datetime.strptime(i, '%Y-%m-%d') x = datetime.strptime(x, '%Y-%m-%d') diff.append(i - x) df = {'--col1--': dates, '--col2--': dates2, '--difference--': diff} df = pd.DataFrame(df) print(df)
Выход:
--col1-- --col2-- --difference-- 0 2012-08-01 2012-08-01 0 days 1 2012-08-15 2012-09-01 -17 days 2 2012-09-01 2012-10-01 -30 days 3 2012-08-15 2012-11-01 -78 days Process finished with exit code 0
Я надеюсь, что это решит вашу проблему.