如何实现pandas下datetime预定义周分组的多周迭代处理
该需求完全可以实现,不需要每周重复复制代码,你可以通过循环迭代或者pandas内置的日期分组功能实现多周批量处理。
现有代码的小修正
你的现有代码里有两处需要注意的问题,避免运行报错或无效果:
df.groupby(by=['datasource_name','id'],as_index=False).sum()没有赋值给变量,分组求和的结果不会生效- 筛选列时用的列名是
datasource,分组时用的是datasource_name,需要和你实际的数据集列名保持一致
方案1:循环迭代指定范围内的所有周
你只需要修改最上方的起止配置参数,就能自动处理对应时间段内的所有周数据,代码如下:
import pandas as pd from datetime import timedelta # 可按需修改的配置参数 first_week_start = '2021-09-26' # 要处理的第一周开始日期 last_week_end = '2023-12-31' # 要处理的最晚周结束日期 # 格式转换与初始化 current_start = pd.to_datetime(first_week_start) last_end = pd.to_datetime(last_week_end) all_weeks_result = [] # 按周迭代处理 while current_start <= last_end: current_end = current_start + timedelta(days=6) # 筛选当前周数据 week_df = df[(df.date >= current_start) & (df.date <= current_end)].copy() # 分组求和 week_agg = week_df.groupby(['datasource', 'id'], as_index=False)[['revenue', 'spend']].sum() # 补上周起止标识 week_agg['start_date'] = current_start.strftime('%Y-%m-%d') week_agg['end_date'] = current_end.strftime('%Y-%m-%d') all_weeks_result.append(week_agg) # 跳到下一周 current_start += timedelta(days=7) # 合并所有周的结果为总表 final_df = pd.concat(all_weeks_result, ignore_index=True)
方案2:pandas内置按周分组(更高效,无需写循环)
如果你的数据是连续的,可以直接用pandas的日期计算功能批量给所有数据打上周标识,一次分组得到所有周的结果:
import pandas as pd from datetime import timedelta # 先确保日期列是datetime格式 df['date'] = pd.to_datetime(df['date']) # 计算每条数据所属周的开始/结束日期(此处配置周起始为周日,和你示例的2021-09-26(周日)对应,如果需要周起始为周一,把下行的+1改成+0即可) df['week_start'] = df['date'] - pd.to_timedelta((df['date'].dt.dayofweek + 1) % 7, unit='d') df['week_end'] = df['week_start'] + timedelta(days=6) # 按周、数据源、id分组求和 final_df = df.groupby(['week_start', 'week_end', 'datasource', 'id'], as_index=False)[['revenue', 'spend']].sum() # 可选:将日期转为你需要的字符串格式 final_df['start_date'] = final_df['week_start'].dt.strftime('%Y-%m-%d') final_df['end_date'] = final_df['week_end'].dt.strftime('%Y-%m-%d')
内容的提问来源于stack exchange,提问作者ledcooing
相关产品推荐
相关产品推荐

