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

如何在Pandas中基于ID添加随时间递增的hour列

问题:基于个体首次记录时间生成递增的hour列

原始数据结构

index    id    name    time     
1        101    A       00:12:00    
2        101    A       00:13:00    
3        101    A       00:14:00    
4        101    A       00:15:00    
.        .      .        .           
.        .      .        .           
59       101    A       01:11:00    
60       101    A       01:12:00    
.        .      .        .           
.        .      .        .           
119      101    A       02:11:00    
120      101    A       02:12:00
121      312    B       00:10:00
122      312    B       00:11:00
123      312    B       00:12:00
.        .      .        .           
.        .      .        .
180      312    B       01:09:00
181      312    B       01:10:00          

需求说明

为DataFrame(命名为df1)添加新列hour:以每个id的首次记录时间为起点,每满1小时,hour值递增1。处理后示例如下:

index    id    name     time        hour
1        101    A       00:12:00    0
2        101    A       00:13:00    0
3        101    A       00:14:00    0
4        101    A       00:15:00    0
.        .      .       .           .
.        .      .       .           .
59       101    A       01:11:00    0
60       101    A       01:12:00    1
.        .      .       .           .
.        .      .       .           .
119      101    A       02:11:00    1
120      101    A       02:12:00    2
121      312    B       00:10:00    0
122      312    B       00:11:00    0
123      312    B       00:12:00    0
.        .      .       .           .       
.        .      .       .           .
180      312    B       01:09:00    0
181      312    B       01:10:00    1

简便实现方法

步骤说明

  1. 将time列转换为timedelta类型,方便计算时间差
  2. 按id分组,计算每条记录与对应组内首次记录时间的差值
  3. 将时间差转换为小时数,取整数部分得到hour值

代码示例

import pandas as pd

# 转换time列为timedelta类型
df1['time'] = pd.to_timedelta(df1['time'])

# 分组计算hour列
df1['hour'] = df1.groupby('id')['time'].apply(
    lambda x: (x - x.min()).dt.total_seconds() // 3600
).reset_index(level=0, drop=True)

代码解释

  • pd.to_timedelta(df1['time']):把字符串格式的时间转换为时间间隔类型,支持直接做减法运算
  • groupby('id')['time']:按个体id分组,单独处理每个个体的时间序列
  • x - x.min():计算每条记录与该id首次记录时间的差值
  • dt.total_seconds() // 3600:将时间差转换为总秒数后除以3600,取整数部分,得到从首次记录开始经过的完整小时数,即hour值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:36:06