为按时间排序的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():计算当前行时间与上一行时间的差值,第一行因为没有前一行,结果是NaNx.diff() > pd.Timedelta(minutes=5):判断时间差是否超过5分钟,返回布尔值(True表示需要切换分组).cumsum():对布尔值累加(True算1,False算0),这样每遇到一个True,分组号就加1,同一组的记录会得到相同的TimeRank值
示例效果
假设你的原始数据是这样的(已经按Time升序):
| Date | Name | Time |
|---|---|---|
| 2017-01-01 | Alice | 08:00:00 |
| 2017-01-01 | Bob | 08:03:00 |
| 2017-01-01 | Charlie | 08:10:00 |
| 2017-01-01 | Dave | 08:12:00 |
| 2017-01-02 | Eve | 09:00:00 |
运行代码后,生成的TimeRank列会是:
| Date | Name | Time | TimeRank |
|---|---|---|---|
| 2017-01-01 | Alice | 08:00:00 | 0 |
| 2017-01-01 | Bob | 08:03:00 | 0 |
| 2017-01-01 | Charlie | 08:10:00 | 1 |
| 2017-01-01 | Dave | 08:12:00 | 1 |
| 2017-01-02 | Eve | 09:00:00 | 0 |
额外提醒
如果你的数据还没按Date和Time排序,记得先执行这一步,不然分组逻辑会出错:
df = df.sort_values(['Date', 'Time'])
内容的提问来源于stack exchange,提问作者Gerry
相关产品推荐
相关产品推荐

