Pandas按ID分组计算时间差并动态重置计数的实现问题
解决步骤
首先需要先将字符串格式的时间列转为Pandas支持的datetime类型,才能正常计算时间差:
import pandas as pd # 转换Datetime列为时间类型,匹配你给出的时间格式 df1['Datetime'] = pd.to_datetime(df1['Datetime'], format='%d%b%Y %H:%M')
你需要的规则核心是动态更新基准时间,无法直接用内置transform实现,所以可以对每个ID分组后用自定义函数处理,逻辑是遍历每个ID的所有交易记录,跟踪当前的基准时间,符合条件就重置基准和计数:
def calc_count(group): # 先按时间排序,确保交易顺序正确 group = group.sort_values('Datetime', ignore_index=True) # 初始化第一个记录的基准时间和计数 base_time = group.loc[0, 'Datetime'] count_list = [1] for idx in range(1, len(group)): # 计算当前记录和基准时间的分钟差 diff_min = (group.loc[idx, 'Datetime'] - base_time).total_seconds() / 60 if diff_min > 30: # 超过30分钟,重置基准和计数 base_time = group.loc[idx, 'Datetime'] count_list.append(1) else: # 未超过,计数加1 count_list.append(count_list[-1] + 1) group['Count'] = count_list return group # 按ID分组应用自定义函数 df_result = df1.groupby('ID', group_keys=False).apply(calc_count)
运行后df_result就是你需要的结果,完全匹配你给出的预期输出。如果你的数据量非常大(百万行以上),可以用numba加速自定义函数提升运行效率,普通业务场景下上述代码足够使用。
内容的提问来源于stack exchange,提问作者Python_Learner
相关产品推荐
相关产品推荐

