我有一个熊猫数据帧(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
然而,我得到的错误是,值的长度与索引的长度不匹配。显然,生成的日期范围比完整的行列表更短。
我想我必须创建一个函数来为每个组生成一个日期范围,添加它,然后在组中附加到一个新的数据帧中。但在我走这条路之前,作为一条更简单的路线,我有什么遗漏吗?对每组进行交互并应用此逻辑的最佳方式是什么?
如果每组每个索引值的长度与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