如何在Pandas中按Position聚合并合并连续时间范围?
Pandas按位置聚合并合并连续时间范围
解决方案步骤
以下是针对需求的具体实现代码,可直接复用:
1. 构造示例数据(替换为你的实际数据即可)
import pandas as pd data = { '日期': ['2023-08-01 12:01:00', '2023-08-01 12:20:00', '2023-08-01 13:10:10', '2023-08-02 12:00:00', '2023-08-02 12:01:00', '2023-08-02 12:05:00'], '位置': ['A23', 'A23', 'A23', 'B12', 'A23', 'A23'] } df = pd.DataFrame(data)
2. 转换日期类型并生成连续位置组ID
先将日期列转为可操作的datetime类型,再标记连续同一位置的记录组(位置与上一行不同时,新建组):
# 转换日期列格式 df['日期'] = pd.to_datetime(df['日期']) # 生成连续位置组ID:位置变化时组ID递增 df['连续组ID'] = df['位置'].ne(df['位置'].shift()).cumsum()
3. 聚合生成时间范围结果
按组ID聚合,提取每组的起始时间、结束时间和位置,并将单条记录的结束时间设为NaN:
# 分组聚合 result = df.groupby('连续组ID').agg( 日期=('日期', 'min'), # 组内最小时间(起始时间) 日期2=('日期', 'max'), # 组内最大时间(结束时间) 位置=('位置', 'first') # 组内位置(所有行位置相同) ).reset_index(drop=True) # 单条记录的结束时间设为NaN result['日期2'] = result['日期2'].where(result['日期'] != result['日期2'], pd.NA)
最终结果
运行代码后,result的数据格式与要求完全一致:
| 日期 | 日期2 | 位置 |
|---|---|---|
| 2023-08-01 12:01:00 | 2023-08-01 13:10:10 | A23 |
| 2023-08-02 12:00:00 | NaN | B12 |
| 2023-08-02 12:01:00 | 2023-08-02 12:05:00 | A23 |
补充说明
如果你的“连续”定义是时间间隔在某个阈值内(比如1小时)就算连续,而非原数据中连续排列,可调整组ID生成逻辑:
# 假设时间间隔<=3600秒(1小时)算连续 time_diff = df['日期'].diff().dt.total_seconds() <= 3600 # 位置相同且时间间隔符合条件的为同一组 df['连续组ID'] = (~(df['位置'] == df['位置'].shift()) | ~time_diff).cumsum()
内容的提问来源于stack exchange,提问作者NC11
相关产品推荐
相关产品推荐

