如何解决合并重叠的日期时间间隔
我有一个具有多个日期时间间隔(开始时间、结束时间)和值的 df。
输入:
id start end value
1 08:00:00.000 12:00:00.000 5
2 09:00:00.000 10:00:00.000 6
2 10:00:00.000 14:00:00.000 4
1 12:00:00.000 15:00:00.000 3
expected output:
id start end value
1 08:00:00.000 09:00:00.000 5
2 09:00:00.000 10:00:00.000 6
1 10:00:00.000 12:00:00.000 5
2 12:00:00.000 14:00:00.000 4
1 14:00:00.000 15:00:00.000 3
其中一些之间存在重叠。目标是有连续的间隔而不重叠。
当有重叠时,我想保留最高值的区间。
我编写了一个在 df 上循环的东西,以找到重叠的间隔,根据条件创建一个新的间隔序列并删除旧的间隔。 我想找到一种替代方法,更好地优化。也许在交叉点和之后分割所有间隔,循环 df 并根据条件删除重叠的间隔。
done = True
while done:
done = False
df_copy = df
for i,row in df.iterrows():
row_interval = pd.Interval(row.start,row.end)
if done:
break
for j,row_copy in row_copy.iterrows():
row_copy_interval = pd.Interval(row_copy.start,row_copy.end)
if i is not j and row_interval.overlaps(row_copy_interval):
earliest_start = np.minimum(row.start,row_copy.start)
latest_start = np.maximum(row.start,row_copy.start)
earliest_end = np.minimum(row.end,row_copy.end)
latest_end = np.maximum(row.end,row_copy.end)
if row.value > row_copy.value:
value = row.value
else:
value = row_copy.value
if row_interval == pd.Interval(earliest_start,earliest_end):
df = df.append('value': row.value,'start': earliest_start,'end': latest_start},ignore_index=True)
df = df.append('value': value,'start': latest_start,'end': earliest_end},ignore_index=True)
df = df.append('value': row_copy.value,'start': earliest_end,'end': latest_end},ignore_index=True)
elif row_interval == pd.Interval(earliest_start,latest_end):
...
elif row_interval == pd.Interval(latest_start,earliest_end):
...
df = df.drop([i,j]).drop_duplicates()
done = True
break
解决方法
我是 portion
的维护者,这是一个 Python 库,用于处理任意(可比)对象的(联合)区间(参见 https://github.com/AlexandreDecan/portion,也可在 PyPI 上获得)。
在 portion
提供的功能中,您会发现 IntervalDict
类,它基本上充当一个经典的 dict,其中的键是(的)区间的(联合)。此类在您的用例中很有帮助,因为它允许您将所有日期(时间)间隔放入一个结构中,并在其上应用一些逻辑。
一个 IntervalDict
对象定义了一个 .merge
函数,该函数接受另一个 IntervalDict
并将一个函数作为输入来解释两个 IntervalDict
实例必须如何合并。使用该函数,您可以指定必须为所有重叠间隔保留值的“最大值”。换句话说:为数据帧的每一行创建一个 IntervalDict
实例,然后使用 .merge
函数作为输入对它们迭代应用 max
,最后你会得到,(key,value)
对的列表,其中每个 key
是一个(非重叠)间隔,每个 value
将是该日期(时间)值间隔的最大值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。