接上文,我们在接到自动化需求后,需要把hivesql语句跑出,然后把结果下载下来做成日报并发送给领导,这里就有领导们要求的格式,我们需要用网页语言模仿表格格式,将每日报表呈现出来。
因为上次是直接导出到csv格式,所以需要使用pandas包读取csv文件,另外如果要使用python发送邮件,还需要加载email、smtplib包,所有这些都准备完毕了之后,正文中还需要对日期进行对比处理,还需要知道今天,昨天,前天,上周今天,上月今天,本月,上月,本年,上年,上年今天的数据,所以还需要加载datetime包。
下面来一步步对我的代码拆分:
第一步:读取数据
import pandas as pd
result1 = pd.read_csv("D:\\pythondata\\hue\\csv\\query_result.csv")
第二步:修改列名
result1.columns =['date','platfrom','behavior','num','invite','real','bind','updatetime','updatedate']
第三步:指定时间
import datetime
now=datetime.datetime.now() """今天"""
now.weekday()"""今天是周几"""
today=now.strftime('%Y-%m-%d') """今天的年月日格式"""
yesday=(now-datetime.timedelta(days=1)).strftime('%Y-%m-%d')"""昨天的年月日格式"""
beforeday=(now-datetime.timedelta(days=2)).strftime('%Y-%m-%d')"""前天的年月日格式"""
lastweekday=(now-datetime.timedelta(days=7)).strftime('%Y-%m-%d')"""上周今天的年月日格式"""
lastweekyesday=(now-datetime.timedelta(days=8)).strftime('%Y-%m-%d')"""上周昨天的年月日格式"""
thismonth=now.strftime('%Y-%m')"""本月的年月格式"""
lastmonth=(datetime.datetime(now.year, now.month, 1)-datetime.timedelta(days=1)).strftime('%Y-%m')"""上月的年月格式"""
thisyear=now.strftime('%Y')"""今年的年格式"""
lastyear=(datetime.datetime(now.year, 1, 1)-datetime.timedelta(days=1)).strftime('%Y')"""去年的年格式"""
第四步:调用数据
a1=int(result1.num[result1.updatedate==today][result1.date==yesday][result1.behavior=='注册'].sum()) """当天注册人数"""
a2=int(result1.real[result1.updatedate==today][result1.behavior=='累计'].sum()-result1.real
[result1.updatedate==yesday][result1.behavior=='累计'].sum())"""当天实名人数"""
a3=int(result1.bind[result1.updatedate==today][result1.behavior=='累计'].sum()-result1.bind[result1.updatedate==yesday][result1.behavior=='累计'].sum())"""当天绑卡人数"""
a4=int(result1.num[result1.date==yesday][result1.behavior=='交易'].sum())"""当天交易人数"""
a5=int(result1.invite[result1.date==yesday][result1.behavior=='交易'].sum())"""当天邀请交易人数"""
a6=round(float(result1.num\
[result1.updatedate==today]\
[result1.date.apply(lambda x: x[:7]) == (datetime.date.today()-datetime.timedelta(days=1)).strftime('%Y-%m')]\
[result1.behavior=='交易'].sum()/10000),2)"""当月实名人数"""
第五步:准备发送邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
mail_msg="""
%s%s
%s
%s%d%s
%s%d%s
%s%d%s
%s%d%s
%s%d%s
%s %s%.2f%s
"""% (datetime.date.today()-datetime.timedelta(days=1),'日报情况','业务线:,'注册用户数:',a1,'人','实名用户数:',a2,'人','绑卡用户数:',a3,'人(后台绑卡数据不全)','新增交易用户数:',a4,'人','新增邀请交易用户数:',a5,'人'
,'交易用户','当月新增交易用户数:',a6,'万人')
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("计划与分析中心",'utf-8')
message['To'] = Header("资金运营",'utf-8')
subject = '玖富资金端日报'
message['Subject'] = Header(subject, 'utf-8')
try:
server=smtplib.SMTP_SSL(mail_host, 465) # 发件人邮箱中的SMTP服务器,端口是465
server.login(mail_user,mail_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(sender,receivers, message.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
print ("邮件发送成功")
except smtplib.SMTPException:
print ("Error: 无法发送邮件")
其中s%代表字符串变量,d%代表整数变量,f%代表浮点变量,.2f%代表浮点变量展示两位小数。
具体代码可以到我的码云中查看:https://gitee.com/goskiller/codes/926bxhml13inqcfud0twr74