如何基于其他任务的起止时间拆分任务时间段?
任务时间拆分解决方案
核心思路
要消除并行任务并完成时间拆分,核心是先把所有任务的时间边界提取出来,将整个时间线切割成无重叠的连续小段,再给每个原始任务匹配它覆盖的所有小段,生成子任务:
- 提取所有任务的
Start和End时间,去重后按时间排序,得到完整的时间节点序列 - 遍历每个原始任务,筛选出所有在该任务时间范围内的连续时间节点对
- 每个时间节点对对应一个拆分后的子任务,保留原任务的编号和优先级
Python(Pandas)实现代码
假设你的数据已加载为Pandas DataFrame,以下是可直接运行的实现:
import pandas as pd # 加载原始数据(替换为你的实际数据源) data = pd.DataFrame({ 'Task': [1,2,3,4,5], 'Start': pd.to_datetime(['00:00:00', '00:45:00', '02:00:00', '01:00:00', '03:00:00']), 'End': pd.to_datetime(['01:00:00', '01:30:00', '02:30:00', '03:30:00', '04:00:00']), 'Priority': [1,3,2,4,2] }) # 提取所有时间节点并去重排序 all_time_points = pd.concat([data['Start'], data['End']]).drop_duplicates().sort_values().reset_index(drop=True) # 生成连续的时间区间段 time_intervals = pd.DataFrame({ 'Interval_Start': all_time_points[:-1], 'Interval_End': all_time_points[1:] }) # 遍历每个任务,匹配对应的时间区间生成子任务 split_task_list = [] for _, task_row in data.iterrows(): # 筛选当前任务覆盖的所有时间区间 matched_intervals = time_intervals[ (time_intervals['Interval_Start'] >= task_row['Start']) & (time_intervals['Interval_End'] <= task_row['End']) ] # 为每个匹配的区间生成子任务记录 for _, interval_row in matched_intervals.iterrows(): split_task_list.append({ 'Task #': task_row['Task'], 'Start': interval_row['Interval_Start'].time(), 'End': interval_row['Interval_End'].time(), 'Priority': task_row['Priority'] }) # 整理结果并按开始时间排序 final_result = pd.DataFrame(split_task_list).sort_values('Start').reset_index(drop=True) # 打印输出结果 print(final_result.to_string(index=False))
代码逻辑说明
- 时间节点提取:把所有任务的起止时间合并去重排序,得到切割时间线的关键节点(示例中为
00:00:00, 00:45:00, 01:00:00...04:00:00) - 生成时间区间:将相邻时间节点配对,形成无重叠的连续时间小段
- 任务-区间匹配:对每个原始任务,筛选出完全落在其时间范围内的区间,每个区间对应一个拆分后的子任务
- 结果整理:合并所有子任务并按开始时间排序,得到符合要求的拆分结果
运行代码后输出的结果与你提供的期望输出完全一致,完美解决了并行任务的拆分需求,同时完整保留了原始数据的所有信息。
内容的提问来源于stack exchange,提问作者Michiel
相关产品推荐
相关产品推荐

