如何在Pandas中为分组数据添加下一组首个时间作为结束时间
实现分组起始时间与下一组起始时间作为结束时间的聚合
原始数据与现有分组代码
原始数据样本:
import pandas as pd df = {"Time": ["2011-01-01 00:00:53","2011-01-01 00:27:47", "2011-01-01 00:28:59", "2011-01-01 00:29:01", "2011-01-01 00:29:02"], "UPN": ["13", "13", "13", "13", "13"], "Value" : [1, 0, 1, 0, 0] } df = pd.DataFrame(df)
已完成的分组代码(可简化为更简洁的写法,效果完全一致):
# 简化逻辑:当Value发生变化时,分组编号自动递增 df["value_grp"] = df.Value.diff().ne(0).cumsum() # 原代码逻辑等价,可直接替换使用 # df["value_grp"] = (df.Value.diff().ne(0).cumsum() | df.Value.diff().eq(0)).cumsum()
实现end_time列的步骤
1. 转换时间列为datetime类型
先确保Time列是可处理的datetime格式,避免后续时间操作出错:
df['Time'] = pd.to_datetime(df['Time'])
2. 聚合分组的起始时间
通过groupby获取每个分组的基础信息与起始时间:
grouped_result = df.groupby('value_grp').agg( UPN=('UPN', 'first'), Value=('Value', 'first'), Start_Time=('Time', 'first') ).reset_index()
3. 添加end_time(下一组的起始时间)
利用shift(-1)方法,将下一组的Start_Time赋值给当前组的end_time:
grouped_result['end_time'] = grouped_result['Start_Time'].shift(-1)
4. 可选:填充最后一组的end_time
如果需要给最后一组的end_time设置为该组的最后一条记录时间,可执行以下代码:
# 获取每个分组的最后一条时间 group_last_times = df.groupby('value_grp')['Time'].last().reset_index(name='group_last_time') # 合并到结果表 grouped_result = grouped_result.merge(group_last_times, on='value_grp') # 填充最后一行空的end_time grouped_result['end_time'] = grouped_result['end_time'].fillna(grouped_result['group_last_time']) # 删除临时辅助列 grouped_result = grouped_result.drop('group_last_time', axis=1)
最终得到的grouped_result将包含每个分组的Start_Time和对应的end_time。
内容的提问来源于stack exchange,提问作者sidra Aleem
相关产品推荐
相关产品推荐

