基于Pandas计算CSV日度累积销量时间序列的月度销量(Max-Min)
解决每日累积销量转月度销量的方案
嘿,这个需求我太熟了——从每日累积销量的CSV里算出每年每个月的实际销量(当月累积最大值减最小值),还要把过去5年同月份的数据放在一起对比对吧?用Python的pandas库处理这种时间序列数据简直是量身定做,我给你捋具体步骤和代码:
第一步:数据读取与预处理
首先得把CSV里的数据读进来,并且把日期列转换成pandas能识别的时间格式,这样才能方便按年按月分组:
- 假设你的CSV文件包含日期时间和累积销量两列,列名比如是
datetime和cumulative_sales - 读取时指定
parse_dates参数把日期列转成datetime类型,同时因为你的日期是DD-MM-YYYY格式,要加上dayfirst=True避免解析错误
第二步:提取年份和月份
为了后续分组,我们需要从datetime字段里把年份和月份单独提出来:
- 用
dt.year提取年份,dt.month提取月份(或者用dt.month_name()得到月份名称,比如"January",看你需求)
第三步:分组计算月度销量
核心就是按「年份+月份」分组,然后对每组的累积销量计算最大值减最小值——因为累积销量是逐日递增的,当月最后一天的累积值减第一天的就是当月实际销量,用max和min更稳妥(万一数据顺序乱了也不怕)
完整代码示例
import pandas as pd # 读取CSV文件,替换成你的文件路径和实际列名 df = pd.read_csv('your_sales_data.csv', parse_dates=['datetime'], dayfirst=True) # 提取年份和月份列 df['year'] = df['datetime'].dt.year df['month'] = df['datetime'].dt.month # 分组计算每个月的实际销量:当月累积最大值 - 最小值 monthly_sales = df.groupby(['year', 'month'])['cumulative_sales'].agg( monthly_sold=lambda x: x.max() - x.min() ).reset_index() # 整理成宽表:每行是月份,每列是年份,方便查看同月份的5年数据 monthly_summary = monthly_sales.pivot( index='month', columns='year', values='monthly_sold' ) # 可选:把月份数字转成英文名称(比如1→January),更直观 monthly_summary.index = pd.to_datetime(monthly_summary.index, format='%m').strftime('%B') # 打印结果或者保存到CSV print(monthly_summary) # monthly_summary.to_csv('monthly_sales_summary.csv')
一些注意事项
- 如果你的CSV列名不是
datetime和cumulative_sales,一定要替换成你实际的列名 - 如果数据里有缺失的日期(比如某天没记录),可以先用
df = df.resample('D', on='datetime').ffill()来填充累积销量,确保每个日期都有数据,避免分组时出现错误 - 代码里的
monthly_sold是自定义的结果列名,你可以改成自己喜欢的名字
内容的提问来源于stack exchange,提问作者jscriptor
相关产品推荐
相关产品推荐

