Python自动周报:清洗+出图+发邮件一条龙
之前给大家零散的分享了PY自动做数据发邮件的信息,今天汇总起来给大家一起梳理一下,思路并不复杂:用Python把"取数→清洗→出图→发邮件"四步串起来,按一下回车,五分钟全搞定批量复杂性工作。
第一步:数据清洗(pandas)
原始表常遇的三类脏数据:重复行、缺失值、日期按字符串存储。一般处理顺序为:先去重,再修类型,最后兜底缺失。
import pandas as pd
df = pd.read_excel('sales.xlsx')
# 1. 去重
df = df.drop_duplicates()
# 2. 日期转成时间类型
df['日期'] = pd.to_datetime(df['日期'])
# 3. 缺失业绩填0,门店填空串
df['业绩'] = df['业绩'].fillna(0)
df['门店'] = df['门店'].fillna('未知')
# 4. 只保留本月
df = df[df['日期'] >= '2026-08-01']
print(df.shape)
第二步:出图(matplotlib)
清洗完后可以直接用matplotlib生成一张门店业绩柱状图,存成图片,后面直接塞进邮件。这一步比较麻烦的是布局,经常会遇到图片被缺失一半的情况。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
top = df.groupby('门店')['业绩'].sum().sort_values(ascending=False).head(10)
plt.figure(figsize=(10, 6))
top.plot(kind='barh')
plt.title('本月门店业绩TOP10')
plt.tight_layout()
plt.savefig('top_shops.png', dpi=120)
不加 tight_layout,图片右边经常被切掉一截。savefig 之前一定确认一下。
第三步:自动发邮件(smtplib)
图和表都齐了,最后一发邮件。把图片按附件格式塞到邮件,点开就能看。
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
msg = MIMEMultipart()
msg['Subject'] = '本周门店业绩自动报表'
msg['From'] = 'me@company.com'
msg['To'] = 'boss@company.com'
with open('top_shops.png', 'rb') as f:
img = MIMEImage(f.read())
img.add_header('Content-ID', '<chart>')
msg.attach(img)
msg.attach(MIMEText('图表见附件图片', 'plain'))
with smtplib.SMTP('smtp.company.com', 25) as s:
s.send_message(msg)
收尾
这套跑顺之后,每周能节省1-2小时。建议先拿最重复性-且不会经常变动的固定格式周报试手,先用本地Excel文件跑通,再连SQL自动取数。第一遍跑通了后面就会轻松很多。
之前的文章,后续这个事项就不再多关注了
告别手动发周报:Python自动发邮件完整方案
我用Python把数据周报从3小时压缩到10分钟