Python 基于重叠时间间隔连接两个数据集
我试图根据重叠的间隔“合并”两个数据帧,如下所示: 数据集1 开始日期 结束日期 字段1 2020-01-01 2020-06-30 A. 2020-07-01 2020-12-31 BPython 基于重叠时间间隔连接两个数据集,python,pandas,algorithm,Python,Pandas,Algorithm,我试图根据重叠的间隔“合并”两个数据帧,如下所示: 数据集1 开始日期 结束日期 字段1 2020-01-01 2020-06-30 A. 2020-07-01 2020-12-31 B 您可以通过以下步骤执行此操作: 对于df1,通过pd.date\u range()定义每行的日期范围,对应于每行从start\u date到end\u date的期间 类似地,对于df2,以类似的方式定义每行的日期范围 将新创建的date\u范围内的df1和df2的日期列表分解为多行,每行中包含一个日期 对每个
您可以通过以下步骤执行此操作:
df1
,通过pd.date\u range()
定义每行的日期范围,对应于每行从start\u date
到end\u date
的期间df2
,以类似的方式定义每行的日期范围date\u范围内的df1
和df2
的日期列表分解为多行,每行中包含一个日期
date\u范围
列上的df1
和df2
执行内部合并。现在,我们已经可以得到每个原始数据帧中公共日期的交点,以便进一步处理field1
和field2
分组,我们可以通过获取组中的第一个条目来获取公共日期范围的新开始日期
end_date
这有用吗@Andreas感谢您的分享,但这是一个稍微不同的问题。@Cambyst您可以做的是将df1中的每个日期范围(开始-结束)与df2中的每个日期范围进行比较,并找到相交的日期范围(记住field1和field2的值)。每个非空交叉点在预期的_输出中成为一行。我现在没有时间为这个问题创造一个真正的答案。但也许这可以为你或其他人指明正确的方向。@jch我的解决方案与你的想法相同。在你发表评论时,我正在对代码进行最后的修饰。
df1a = (df1.assign(date_range=df1.apply(lambda x: pd.date_range(start=x['start_date'], end=x['end_date']), axis=1))
.explode('date_range'))
df2a = (df2.assign(date_range=df2.apply(lambda x: pd.date_range(start=x['start_date'], end=x['end_date']), axis=1))
.explode('date_range'))
df3 = df1a.merge(df2a, on='date_range')
df3['start_date'] = df3.groupby(['field1', 'field2'])['date_range'].transform('first')
df3['end_date'] = df3.groupby(['field1', 'field2'])['date_range'].transform('last')
df4 = df3.groupby(['field1', 'field2']).agg('first').reset_index()[['start_date', 'end_date', 'field1', 'field2']]
print(df4)
start_date end_date field1 field2
0 2020-01-01 2020-04-30 A D
1 2020-05-01 2020-06-30 A E
2 2020-07-01 2020-08-31 B E
3 2020-09-01 2020-12-31 B F