Добавить новый столбец в pandas фрейм данных с датами приращения в группах - PullRequest
1 голос
/ 03 апреля 2020

У меня есть pandas фрейм данных (df), который сгруппирован по значению индекса. с повторяющимися строками.

Я хотел бы добавить новый столбец с датами для каждой строки, представляющими каждый день в пределах df.start_date и df.end_date для каждой группы:

Из этого:

index    start_date   end_date    number_of_days  value
0        8/12/2019    10/12/2019  3               2091
0        8/12/2019    10/12/2019  3               2091
0        8/12/2019    10/12/2019  3               2091
1        11/12/2019   14/12/2019  4               2214
1        11/12/2019   14/12/2019  4               2214
1        11/12/2019   14/12/2019  4               2214
1        11/12/2019   14/12/2019  4               2214
2        15/12/2019   16/12/2019  2               8430
2        15/12/2019   16/12/2019  2               8430

К этому:

index    start_date   end_date    number_of_days  value  NEW_COLUMN
0        8/12/2019    10/12/2019  3               2091   8/12/2019
0        8/12/2019    10/12/2019  3               2091   9/12/2019
0        8/12/2019    10/12/2019  3               2091   10/12/2019
1        11/12/2019   14/12/2019  4               2214   11/12/2019
1        11/12/2019   14/12/2019  4               2214   12/12/2019 
1        11/12/2019   14/12/2019  4               2214   13/12/2019
1        11/12/2019   14/12/2019  4               2214   14/12/2019
2        15/12/2019   16/12/2019  2               8430   15/12/2019
2        15/12/2019   16/12/2019  2               8430   16/12/2019

До сих пор мне удавалось создать диапазон дат на основе pd.date_range, а затем попытаться добавить этот диапазон в качестве нового значения в фрейм данных ..

#generate a daily date range based on min and max values
date_range_to_add = pd.date_range(start=min(df['start_date'])
                                  ,end=max(df['end_date']),freq='D')

repeated_dw_data['dates']= date_range_to_add

Однако ошибка, которую я получаю, состоит в том, что длина значений не соответствует длине индекса. Очевидно, что сгенерированный диапазон дат короче, чем полный список строк.

Я думаю, мне придется создать функцию для генерации диапазона дат для каждой группы, добавить ее, а затем добавить в группу в новый фрейм данных. Но прежде чем я go пойдет по этому пути, есть ли что-то, что я пропускаю как более простой маршрут? Как лучше всего взаимодействовать с каждой группой и применять эту логику c?

1 Ответ

1 голос
/ 03 апреля 2020

Если длина каждой группы по значениям индекса такая же, как у number_of_days, решение столбца должно создавать временные интервалы дней с помощью счетчика на GroupBy.cumcount и to_timedelta и добавлять к start_date столбец:

repeated_dw_data['start_date']=pd.to_datetime(repeated_dw_data['start_date'], dayfirst=True)

td = pd.to_timedelta(repeated_dw_data.groupby(level=0).cumcount(), unit='d')
repeated_dw_data['new'] = repeated_dw_data['start_date'] + td
print (repeated_dw_data)
      start_date    end_date  number_of_days  value        new
index                                                         
0     2019-12-08  10/12/2019               3   2091 2019-12-08
0     2019-12-08  10/12/2019               3   2091 2019-12-09
0     2019-12-08  10/12/2019               3   2091 2019-12-10
1     2019-12-11  14/12/2019               4   2214 2019-12-11
1     2019-12-11  14/12/2019               4   2214 2019-12-12
1     2019-12-11  14/12/2019               4   2214 2019-12-13
1     2019-12-11  14/12/2019               4   2214 2019-12-14
2     2019-12-15  16/12/2019               2   8430 2019-12-15
2     2019-12-15  16/12/2019               2   8430 2019-12-16
...