Pandas中结合Unavailable Power合并重叠日期区间的问题
核心思路
要解决你的问题,关键是先按Unit和Unavailable power双重分组,确保只在这两个字段完全相同的组内处理日期区间合并,同时保留Nominal power等字段。具体步骤如下:
步骤1:确保日期列是datetime类型
首先要把Start和End列转换为datetime格式,否则无法正确比较日期:
import pandas as pd # 转换日期列类型 df['Start'] = pd.to_datetime(df['Start']) df['End'] = pd.to_datetime(df['End'])
步骤2:分组并合并重叠区间
通过分组+自定义函数实现区间合并,同时保留所有需要的字段:
def merge_intervals(group): # 按Start日期排序,保证区间顺序正确 sorted_group = group.sort_values('Start') # 生成合并标记:当前区间的Start <= 上一个区间的End时,属于同一合并组 sorted_group['merge_tag'] = (sorted_group['Start'] > sorted_group['End'].shift()).cumsum() # 聚合得到合并后的结果:取每组最早的Start、最晚的End,保留其他字段 merged = sorted_group.groupby('merge_tag').agg( Start=('Start', 'min'), End=('End', 'max'), Unit=('Unit', 'first'), Nominal_power=('Nominal power', 'first'), Unavailable_power=('Unavailable power', 'first') ).drop('merge_tag', axis=1) return merged # 按Unit、Unavailable power分组(如果同一Unit下Nominal power固定,可加入分组键确保一致性) result = df.groupby(['Unit', 'Unavailable power', 'Nominal power'], as_index=False).apply(merge_intervals) result = result.reset_index(drop=True)
关键细节说明
- 分组逻辑:必须同时按
Unit和Unavailable power分组,彻底避免不同功率值的区间被错误合并。如果你的业务中同一Unit的Nominal power是固定值,加入Nominal power到分组键可以确保结果中该字段的一致性。 - 合并标记:
merge_tag通过判断当前区间的开始是否晚于上一个区间的结束,来区分独立区间和需要合并的区间,cumsum会给连续/重叠的区间分配相同的标记。 - 连续区间处理:如果需要合并相邻但不重叠的区间(比如前一个End是
2023-01-05,后一个Start是2023-01-06),可以把判断条件改为:sorted_group['merge_tag'] = (sorted_group['Start'] > sorted_group['End'].shift() + pd.Timedelta(days=1)).cumsum()
示例验证
假设你的原始数据是:
| Unit | Start | End | Nominal power | Unavailable power |
|---|---|---|---|---|
| A | 2023-01-01 | 2023-01-05 | 100 | 20 |
| A | 2023-01-03 | 2023-01-07 | 100 | 20 |
| A | 2023-01-10 | 2023-01-15 | 100 | 30 |
| A | 2023-01-12 | 2023-01-20 | 100 | 30 |
运行代码后会得到:
| Start | End | Unit | Nominal_power | Unavailable_power |
|---|---|---|---|---|
| 2023-01-01 | 2023-01-07 | A | 100 | 20 |
| 2023-01-10 | 2023-01-20 | A | 100 | 30 |
完全符合你的需求:同一Unit+Unavailable power的重叠区间被合并,且所有字段都保留。
内容的提问来源于stack exchange,提问作者nicolax9777
相关产品推荐
相关产品推荐

