在熊猫数据框中添加新列,并在组内增加日期

时间:2020-04-03 10:36:25

标签: python pandas dataframe pandas-groupby

我有一个按索引值分组的熊猫数据框(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

但是,我得到的错误是值的长度与索引的长度不匹配。显然,因为生成的日期范围比行的完整列表短。

我认为我将不得不创建一个函数来为每个组生成一个日期范围,添加该日期范围,然后将其追加到新的数据框中。但是,在我走这条路之前,作为简单的路线,我还缺少什么吗?在每个小组之间进行交流并应用此逻辑的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

如果每个组的每个索引值的长度相同,例如number_of_days列,则应通过GroupBy.cumcountto_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