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

为按时间排序的DataFrame添加同日内5分钟聚类的TimeRank列

嘿,这个分组需求很常见,咱们用Pandas几步就能搞定!先给你理清楚思路,再上代码和示例。

解决步骤

1. 确保时间列格式正确

首先得保证你的Time列是datetime类型,不然没法计算时间差。如果现在是字符串格式,先转一下:

import pandas as pd

# 转换Time列为datetime(根据你的实际格式调整format参数,比如'%H:%M:%S'是时分秒)
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S')
# 顺便把Date列转成日期对象,避免时间部分干扰分组
df['Date'] = pd.to_datetime(df['Date']).dt.date

2. 按日期分组生成TimeRank

核心逻辑是:对每个日期内的时间序列,计算当前时间与前一个时间的差值,当差值超过5分钟时,就开启一个新的分组。用cumsum()来累计这些“分组切换点”,就能得到同一组的相同标识。

代码如下:

# 按Date分组,计算每组内的时间差,生成TimeRank
df['TimeRank'] = df.groupby('Date')['Time'].apply(
    lambda x: (x.diff() > pd.Timedelta(minutes=5)).cumsum()
)

代码解释

  • x.diff():计算当前行时间与上一行时间的差值,第一行因为没有前一行,结果是NaN
  • x.diff() > pd.Timedelta(minutes=5):判断时间差是否超过5分钟,返回布尔值(True表示需要切换分组)
  • .cumsum():对布尔值累加(True算1,False算0),这样每遇到一个True,分组号就加1,同一组的记录会得到相同的TimeRank值

示例效果

假设你的原始数据是这样的(已经按Time升序):

DateNameTime
2017-01-01Alice08:00:00
2017-01-01Bob08:03:00
2017-01-01Charlie08:10:00
2017-01-01Dave08:12:00
2017-01-02Eve09:00:00

运行代码后,生成的TimeRank列会是:

DateNameTimeTimeRank
2017-01-01Alice08:00:000
2017-01-01Bob08:03:000
2017-01-01Charlie08:10:001
2017-01-01Dave08:12:001
2017-01-02Eve09:00:000

额外提醒

如果你的数据还没按Date和Time排序,记得先执行这一步,不然分组逻辑会出错:

df = df.sort_values(['Date', 'Time'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:36:36