如何查找日期范围重叠的行?

2024-09-28 22:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含如下数据的数据帧(数据的小子集):

enter image description here

我试图找到一种方法,在这个方法中,我可以创建一个新的dataframe,它包含对以下对象具有相同值的所有行:carrierflightnumberdepartureAirport和{},但也有重叠的日期范围。在

我所说的重叠是指一行的effectiveDate位于另一个记录的effectiveDate和{}之间,而另一个记录的值与我前面提到的其他列的值相同。在

所以在我上面的例子中,前两行被认为是一个例子(应该都包含在新的数据帧中),但是第三行不是。在

我假设我想使用groupby,但我不太清楚我将应用什么聚合函数。以下是我目前所掌握的情况:

df.groupby(['carrier','flightnumber','departureAirport','arrivalAirport'])['effectiveDate', 'discontinuedDate'].min()

但显然我需要应用一个确定重叠的函数,而不是min()。如何确定重叠而不是返回该组的最小值?在

更新:

^{pr2}$

更新2:

至于输出,我希望在新的数据帧中返回任何重叠的行,carrierflightnumberdepartureAirport和{}的值相同。这些行不需要包含任何附加数据。因此,对于上面的示例数据,下面这样的数据帧是我想要的输出:

carrier flightnumber  departureAirport  arrivalAirport  effectiveDate discontinuedDate
4U      9748          DUS               GVA             2017-05-09    2017-07-12
4U      9748          DUS               GVA             2017-05-14    2017-07-16
AG      1234          SFO               DFW             2017-03-09    2017-05-12
AG      1234          SFO               DFW             2017-03-14    2017-05-16

请注意,只有一条记录被排除(第三条记录用于9748)-这是因为它的日期范围与同一航班的其他记录不重叠。在


Tags: 数据方法函数记录min例子groupbycarrier
1条回答
网友
1楼 · 发布于 2024-09-28 22:23:42

高级概念

  • 按所有日期排序,如果有完全重叠,则按effectiveDate排序。在
  • 累加和是在排序之前初始化的交替值和负数。关键是当累计和超过1时,就会发生重叠。当和下降到0时,一个连续的组结束。在
  • 取消排序并确定零发生的位置。。。这是重叠组的结束。在
  • 在这些断点上拆分数据帧索引,并且只接受拆分大小大于1的拆分。在
  • 连接传递的拆分并使用loc来获取切片数据帧。在

def overlaping_groups(df):
    n = len(df)
    cols = ['effectiveDate', 'discontinuedDate']
    v = np.column_stack([df[c].values for c in cols]).ravel()
    i = np.tile([1, -1], n)
    a = np.lexsort([-i, v])
    u = np.empty_like(a)
    u[a] = np.arange(a.size)
    e = np.flatnonzero(i[a].cumsum()[u][1::2] == 0)
    d = np.diff(np.append(-1, e))
    s = np.split(df.index.values, e[:-1] + 1)

    return df.loc[np.concatenate([g for j, g in enumerate(s) if d[j] > 1])]

gcols = ['carrier', 'flightnumber', 'departureAirport', 'arrivalAirport']
df.groupby(gcols, group_keys=False).apply(overlaping_groups)

  carrier  flightnumber departureAirport arrivalAirport effectiveDate discontinuedDate
0      4U          9748              DUS            GVA    2017-05-09       2017-07-12
1      4U          9748              DUS            GVA    2017-05-14       2017-07-16
3      AG          1234              SFO            DFW    2017-03-09       2017-05-12
4      AG          1234              SFO            DFW    2017-03-14       2017-05-16

相关问题 更多 >