You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:002023-08-01 13:10:10A23
2023-08-02 12:00:00NaNB12
2023-08-02 12:01:002023-08-02 12:05:00A23

补充说明

如果你的“连续”定义是时间间隔在某个阈值内(比如1小时)就算连续,而非原数据中连续排列,可调整组ID生成逻辑:

# 假设时间间隔<=3600秒(1小时)算连续
time_diff = df['日期'].diff().dt.total_seconds() <= 3600
# 位置相同且时间间隔符合条件的为同一组
df['连续组ID'] = (~(df['位置'] == df['位置'].shift()) | ~time_diff).cumsum()

内容的提问来源于stack exchange,提问作者NC11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:15:59