gpt4 book ai didi

python - 如何查找具有重叠日期范围的行?

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:17 25 4
gpt4 key购买 nike

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

enter image description here

我正在尝试找出一种方法来创建一个新的数据框,其中包含具有相同值的所有行:carrierflightnumberdepartureAirportarrivalAirport 但也有重叠的日期范围。

我所说的重叠是指一行的 effectiveDate 介于 effectiveDate 和另一条记录的 discontinuedDate 之间,另一条记录具有相同的值我提到的专栏。

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

我假设我想使用 groupby ,但我并不完全清楚我将应用什么聚合函数。以下是我目前所拥有的:

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

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

更新:

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
4U 9748 DUS GVA 2017-07-18 2017-08-27
AG 1234 SFO DFW 2017-03-09 2017-05-12
AG 1234 SFO DFW 2017-03-14 2017-05-16

更新 2:

就输出而言,我希望有任何重叠的行,并且 carrierflightnumberdepartureAirport 具有相同的值和 arrivalAirport 在新数据框中返回。这些行不需要包含任何其他数据。因此,对于上面的示例数据,像下面这样的数据框将是我想要的输出:

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 的第三条记录)- 这是因为它的日期范围不与同一航类的其他记录重叠。

最佳答案

高级概念

  • 按所有日期排序,如果存在完全重叠,则优先考虑 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

关于python - 如何查找具有重叠日期范围的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44288858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com