python-3.x - 以其他列的优先级调整 group by 中的重叠日期
问题描述
正如标题建议的那样,我正在解决一个问题,即根据 ID 查找重叠日期并根据优先级(重量)调整重叠日期。以下代码有助于找到重叠的日期。
df['overlap'] = (df.groupby('ID')
.apply(lambda x: (x['End_date'].shift() - x['Start_date']) > timedelta(0))
.reset_index(level=0, drop=True))
df
现在我面临的问题是,如何引入优先级(权重)并以此调整 start_date。在下图中,我突出显示了基于权重的调整日期,其中 A 优先于 B,B 优先于 C。
我应该为字符串到数字权重值创建一个字典,然后呢?我被困在这里设置逻辑。
数据框:
op_d = {'ID': [1,1,1,2,2,3,3,3],'Start_date':['9/1/2020','10/10/2020','11/18/2020','4/1/2015','5/12/2016','4/1/2015','5/15/2016','8/1/2018'],\
'End_date':['10/9/2020','11/25/2020','12/31/2020','5/31/2016','12/31/2016','5/29/2016','9/25/2018','10/15/2020'],\
'Weight':['A','B','C','A','B','A','B','C']}
df = pd.DataFrame(data=op_d)
解决方案
您已经确定了重叠条件,然后您可以尝试在 End_Date 和班次中添加一天,然后将它们分配给重叠列为 true 的开始日期:
arr = np.where(df['overlap'],df['End_date'].add(pd.Timedelta(1,unit='d')).shift(),
df['Start_date'])
out = df.assign(Output_Start_Date = arr,Output_End_Date=df['End_date'])
print(out)
ID Start_date End_date Weight overlap Output_Start_Date Output_End_Date
0 1 2020-09-01 2020-10-09 A False 2020-09-01 2020-10-09
1 1 2020-10-10 2020-11-25 B False 2020-10-10 2020-11-25
2 1 2020-11-18 2020-12-31 C True 2020-11-26 2020-12-31
3 2 2015-04-01 2016-05-31 A False 2015-04-01 2016-05-31
4 2 2016-05-12 2016-12-31 B True 2016-06-01 2016-12-31
5 3 2015-04-01 2016-05-29 A False 2015-04-01 2016-05-29
6 3 2016-05-15 2018-09-25 B True 2016-05-30 2018-09-25
7 3 2018-08-01 2020-10-15 C True 2018-09-26 2020-10-15
推荐阅读
- javascript - 如何将 Material UI 的 HOC 组合在一起
- javascript - Node js new Date() 和 Browser new Date() 给出不同的日期
- javascript - 安全数学课。如何创建可链接的计算?
- flutter - 如何在flutter中使用一个streamBuilder从firestore中检索文本和图像?
- laravel - 如何过滤 laravel 模型关系,如果关系为空/null,则不应显示对象
- javascript - 如何使用javascript异步加载链接?
- java - 在预算内选择可能的菜单项组合的算法或解决方案
- python - pip 与 conda 中的冲突解决
- java - 任何对象值更改的侦听器?
- node.js - 使用 Apps Platform 将 nodejs 部署到 Digital Ocean 时出现问题