按Work分组且日期间隔不超3天的Pandas数据处理需求
解决Pandas中按Work分组且组内日期间隔≤3天的需求
你之前的方法问题在于直接对整个Work分组,没有考虑同一Work下的日期分段——比如Work1包含2021年和2022年两段间隔极大的记录,需要拆成两个独立分组。下面是具体实现步骤:
步骤1:预处理日期列
首先要把字符串格式的Date转为Pandas可识别的datetime类型,否则无法计算日期差:
import pandas as pd # 初始化数据集 df = pd.DataFrame([['Work1','Task1','08-12-2021'], ['Work1','Task2','09-12-2021'], ['Work1','Task3','10-12-2021'],['Work2','Task1','20-12-2021'],['Work2','Task2','20-12-2021'],['Work2','Task3','21-12-2021'],['Work1','Task1','10-12-2022'],['Work1','Task2','11-12-2022']], columns=['Work', 'Task','Date']) # 转换日期格式(匹配日-月-年的输入格式) df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y')
步骤2:生成Work内的分组标识
按Work分组后,对每组记录按日期排序,计算相邻日期的差值,当差值超过3天时标记为新分组起点,最终生成每个记录的组ID:
# 按Work+Date排序,确保日期顺序正确 df_sorted = df.sort_values(['Work', 'Date']).reset_index(drop=True) # 按Work分组计算相邻日期的间隔天数 df_sorted['date_diff'] = df_sorted.groupby('Work')['Date'].diff().dt.days # 标记新分组:组内第一条记录或间隔超3天的记录,标记为新分组起点 df_sorted['new_group'] = (df_sorted['date_diff'] > 3) | df_sorted['date_diff'].isna() # 累加标记值,生成每个Work内的分组ID df_sorted['group_id'] = df_sorted.groupby('Work')['new_group'].cumsum()
步骤3:聚合得到目标结果
按Work和group_id分组,聚合出每组的起止日期、首尾Task:
# 聚合计算所需字段 result = df_sorted.groupby(['Work', 'group_id']).agg( start_date=('Date', 'min'), end_date=('Date', 'max'), start_task=('Task', 'first'), end_task=('Task', 'last') ).reset_index() # 生成友好的分组标识(如Work1_1) result['group_label'] = result['Work'] + '_' + result['group_id'].astype(str) # 整理最终输出列顺序 final_result = result[['group_label', 'start_date', 'end_date', 'start_task', 'end_task']] print(final_result)
运行后输出结果:
group_label start_date end_date start_task end_task 0 Work1_1 2021-12-08 2021-12-10 Task1 Task3 1 Work1_2 2022-12-10 2022-12-11 Task1 Task2 2 Work2_1 2021-12-20 2021-12-21 Task1 Task3
该结果完全满足需求:同一Work下间隔≤3天的记录被归为独立分组,每个分组包含专属标识、起止日期及首尾Task。
内容的提问来源于stack exchange,提问作者Very_new_to_this
相关产品推荐
相关产品推荐

