Python: Создайте новый столбец, который подсчитывает дни между текущей датой и запаздывающей датой

#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  

Я надеюсь, что это решит вашу проблему.