如何在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
简便实现方法
步骤说明
- 将
time列转换为timedelta类型,方便计算时间差 - 按
id分组,计算每条记录与对应组内首次记录时间的差值 - 将时间差转换为小时数,取整数部分得到
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
相关产品推荐
相关产品推荐

