Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于重叠时间间隔连接两个数据集_Python_Pandas_Algorithm - Fatal编程技术网

Python 基于重叠时间间隔连接两个数据集

Python 基于重叠时间间隔连接两个数据集,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的日期列表分解为多行,每行中包含一个日期 对每个

我试图根据重叠的间隔“合并”两个数据帧,如下所示:

数据集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
    的日期列表分解为多行,每行中包含一个日期
  • 对每个数据帧中的
    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