如何高效实现按周分组统计支出并生成DataFrame?
优化按周统计支出的冗余代码
问题场景
当前你通过手动指定每个周的日期区间来统计支出,代码重复度极高,全年52周会产生大量冗余代码,以下是基于pandas的高效优化方案:
原始冗余代码示例
W1 = df[df['date'].between('2022-01-03', '2022-01-09')] W1_spend_df = W1[['date', 'amount']] W1_total = W1_spend_df['amount'].sum() W2 = df[df['date'].between('2022-01-10', '2022-01-17')] W2_spend_df = W2[['date', 'amount']] W2_total = W2_spend_df['amount'].sum() # 转换结果为DataFrame data = [['W1', W1_total], ['W2', W2_total]] df_result = pd.DataFrame(data, columns = ['W', 'amount'])
优化方案一:使用resample按周聚合
适合需要自定义周起始日(如周一/周日)的场景,步骤如下:
- 确保日期列是datetime类型(如果尚未转换)
- 调用
resample按周批量统计总支出 - 生成周标识(W1/W2...)
import pandas as pd # 转换date列为datetime类型(必要前置操作) df['date'] = pd.to_datetime(df['date']) # 按周统计支出,指定每周一为周起始(匹配你示例中的周区间) weekly_spend = df.resample('W-MON', on='date')['amount'].sum().reset_index() # 添加W+周数的标识列 weekly_spend['W'] = 'W' + weekly_spend['date'].dt.isocalendar().week.astype(str) # 整理成目标格式 weekly_spend = weekly_spend[['W', 'amount']]
注:如果需要周日作为周起始,可将
'W-MON'改为'W-SUN',pandas默认'W'代表周日为周结束日。
优化方案二:使用dt.isocalendar()按ISO周分组
ISO标准周以周一为起始,每年最多53周,适合严格遵循ISO周规则的场景:
import pandas as pd # 转换date列为datetime类型 df['date'] = pd.to_datetime(df['date']) # 按ISO周分组统计总支出 weekly_group = df.groupby(df['date'].dt.isocalendar().week)['amount'].sum().reset_index() # 重命名并生成周标识 weekly_group.columns = ['week_num', 'amount'] weekly_group['W'] = 'W' + weekly_group['week_num'].astype(str) # 整理成目标格式 weekly_result = weekly_group[['W', 'amount']]
优化优势
- 无需手动编写52次区间判断代码,仅需几行即可完成全年统计
- 基于pandas内置的时间分组逻辑,处理效率远高于手动循环/切片
- 支持自定义周起始规则,适配不同业务场景
内容的提问来源于stack exchange,提问作者Robin Baggott la Velle
相关产品推荐
相关产品推荐

