Python实现按月统计order_id数量、销售额及累计值求助
Python按月统计订单并计算累计销售额的正确实现
你的代码存在以下几个问题:
- 列名引用错误:原数据日期列是
delivered_date,但你写了orders_df.dates,导致找不到目标列 - 时间格式符错误:
%M代表分钟,提取月份应该用%m,且目标格式是YYYY-MM,需指定为'%Y-%m' - GroupBy用法错误:不能直接把聚合函数传入
groupby(),需要用agg()方法指定不同列的聚合逻辑
修正后的完整代码:
import pandas as pd # 构造示例数据 data = { 'order_id': [1, 2, 3, 4], 'delivered_date': ['2021-01-01 11:00:00 UTC', '2021-02-01 11:00:00 UTC', '2021-03-01 11:00:00 UTC', '2021-02-28 11:00:00 UTC'], 'amount': [233.12, 200.00, 400.00, 120.00] } orders_df = pd.DataFrame(data) # 1. 将日期列转换为datetime类型,解析UTC时间 orders_df['delivered_date'] = pd.to_datetime(orders_df['delivered_date'], utc=True) # 2. 提取年月作为分组列(格式YYYY-MM) orders_df['month'] = orders_df['delivered_date'].dt.strftime('%Y-%m') # 3. 分组聚合:统计订单数、销售额总和 monthly_stats = orders_df.groupby('month').agg( count_order_id=('order_id', 'count'), sum_amount=('amount', 'sum') ).reset_index() # 4. 计算累计销售额 monthly_stats['cumulative'] = monthly_stats['sum_amount'].cumsum() # 重命名列以匹配期望结果 monthly_stats.rename(columns={ 'month': 'delivered_date', 'count_order_id': 'count(order_id)', 'sum_amount': 'sum(amount)' }, inplace=True) print(monthly_stats)
运行结果:
| delivered_date | count(order_id) | sum(amount) | cumulative |
|---|---|---|---|
| 2021-01 | 1 | 233.12 | 233.12 |
| 2021-02 | 2 | 320.00 | 553.12 |
| 2021-03 | 1 | 400.00 | 953.12 |
关键步骤说明:
- 必须先将字符串格式的日期转换为
datetime类型,才能使用dt访问器提取年月 - 使用
agg()可以灵活指定不同列的聚合函数,同时自定义结果列名 cumsum()方法直接计算销售额的累计值,无需手动循环
内容的提问来源于stack exchange,提问作者Woofer
相关产品推荐
相关产品推荐

