我的知识记录

Python生成月度销售报表图表:自动汇总出图

用Python pandas按月汇总销售数据,matplotlib自动生成柱状图+折线图+饼图组合的月度报表,一键跑完直接贴PPT,代码完整可运行。

场景痛点

每个月初都要做上个月的销售报表:从明细表汇总到月度数据,画销售额柱状图、同比增长折线、产品占比饼图,再贴到PPT里。一套流程手动做半天,数据还容易汇总错。用Python脚本,读入原始销售明细,自动按月分组、自动画图、自动保存图片,月初一键跑完直接用。

用到的库

pip install matplotlib pandas openpyxl

完整代码

# 导入库
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
import os

# 解决中文乱码
matplotlib.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "Arial Unicode MS"]
matplotlib.rcParams["axes.unicode_minus"] = False


def ensure_sample_data(path):
"""生成示例销售明细数据,方便直接跑通"""
if os.path.exists(path):
return
import random
random.seed(0)
rows = []
products = ["产品A", "产品B", "产品C", "产品D"]
for day in pd.date_range("2026-01-01", "2026-06-30", freq="D"):
for _ in range(random.randint(5, 15)):
rows.append({
"日期": day,
"产品": random.choice(products),
"金额": round(random.uniform(800, 5000), 2),
})
pd.DataFrame(rows).to_excel(path, index=False)
print(f"已生成示例销售明细 {path}")


def monthly_sales_report(excel_path):
ensure_sample_data(excel_path)

# 1. 读取明细数据
df = pd.read_excel(excel_path)
df["日期"] = pd.to_datetime(df["日期"])
df["月份"] = df["日期"].dt.month  # 提取月份

# 2. 按月汇总总销售额
monthly = df.groupby("月份")["金额"].sum().round(0)
month_labels = [f"{m}月" for m in monthly.index]

# 3. 按产品汇总半年销售额
product_sum = df.groupby("产品")["金额"].sum()

# 4. 创建2行1列的子图:上柱状下饼图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))

# 上图:月度销售额柱状图
bars = ax1.bar(month_labels, monthly.values, color="#4C72B0", alpha=0.8)
ax1.set_title("上半年月度销售额", fontsize=15)
ax1.set_ylabel("销售额(元)")
for bar in bars:
h = bar.get_height()
ax1.text(bar.get_x() + bar.get_width() / 2, h,
f"{h:,.0f}", ha="center", va="bottom", fontsize=9)

# 下图:产品占比饼图
ax2.pie(product_sum.values, labels=product_sum.index,
autopct="%1.1f%%", startangle=90,
colors=["#4C72B0", "#55A868", "#C44E52", "#8172B2"])
ax2.set_title("上半年产品销售占比", fontsize=15)

plt.tight_layout()
plt.savefig("monthly_sales_report.png", dpi=150)
plt.close()
print(f"月度销售报表图已保存为 monthly_sales_report.png")
print(f"月度销售额:\n{monthly}")


if __name__ == "__main__":
monthly_sales_report("sales_detail.xlsx")

代码讲解

  • ensure_sample_data() 生成半年的销售明细数据,每行是一笔订单记录,包含日期、产品、金额。实际用的时候把你自己的明细Excel替换掉即可。
  • df["日期"].dt.month 从日期里提取月份数字,groupby("月份") 按月分组汇总销售额,一行代码完成手动数据透视表的工作。
  • 上图用柱状图画月度总销售额,柱顶用 f"{h:,.0f}" 格式化成千分位数字,大额金额读起来清晰。
  • 下图用饼图画四个产品半年的销售占比,startangle=90 让第一块从正上方开始。
  • subplots(2, 1) 上下排列两个子图,适合放在一张报表页里。

运行结果

当前目录先生成 sales_detail.xlsx,然后输出 monthly_sales_report.png。上半部分是1到6月的月度销售额柱状图,柱顶标注具体金额;下半部分是四个产品的销售占比饼图。终端同时打印每月销售总额方便核对。

注意事项

  • 实际业务中明细数据可能有几千行,groupby聚合是秒级的,不用担性能。
  • 如果要做同比,需要去年同月数据,多带一列"年份"再 groupby(["月份", "年份"])
  • 金额列如果Excel里是文本格式带逗号,先 df["金额"] = df["金额"].astype(str).str.replace(",", "").astype(float) 清洗。
  • 报表图建议直接存成300dpi PNG,贴PPT不会糊。

Python生成月度销售报表图表:自动汇总出图

标签:

更新时间:2026-09-14 20:28:17

上一篇:Python pyecharts生成交互式柱状图:带悬停提示的HTML

下一篇:Python matplotlib多子图subplot:一张图放多个子图