You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效实现按周分组统计支出并生成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按周聚合

适合需要自定义周起始日(如周一/周日)的场景,步骤如下:

  1. 确保日期列是datetime类型(如果尚未转换)
  2. 调用resample按周批量统计总支出
  3. 生成周标识(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:50:25