问题的提出
“图书销售订单数据.xlsx”是某出版单位通过网络平台销售的图书订单数据,时间从2018年到2021年。

要求通过“下单时间”字段按年度汇总图书销售月度订单数据,汇总字段为订单总额、订单数量、折扣总额。汇总结果写入到新EXCEL文件,汇总的年度名称为工作表名称,汇总结果如下图所示。

编程思路
分析数据,确定需要汇总的字段
观察“下单时间”字段,该字段时间格式为“yyyy-mm-dd hh:mm:ss”,可以从该字段获取日期和时间。“订单价格”字段为每个订单的支付金额,对该字段在年度内按月累加汇总,汇总结果字段为“订单总额”。“折扣”字段为每个订单的折扣金额,对该字段在年度内按月累加汇总,汇总结果字段为“折扣总额”。汇总结果字段“订单数量”的汇总字段,需要认真分析,要求该字段的值不能重复,才能汇总出正确的订单数量,仔细观察所有字段,“订单编号”字段满足“订单数量”汇总需求。
分析需求,梳理汇总思路
订单数据范围为2018~2021年,需要汇总出2018年、2019年、2020年、2021年的月度订单数据。
按“下单时间”字段以月分组,在分组过程中同时进行“订单价格”、“折扣”、“订单编号”字段的聚合。“订单价格”、“折扣”字段进行累加聚合,“订单编号”字段进行数量聚合。分组聚合后的数据再按“下单时间”字段以年分组,至此完成订单数据的汇总统计并写入EXCEL文件。
程序设计
案例需求相对简单,程序代码编写到一个模块即可。程序流程如下图所示。

程序需要导入Pandas库,Pandas库的read_excel()函数可以直接读取EXCEL数据,并返回DataFrame数据对象。
DataFrame数据对象的groupby()函数可以对DataFrame按条件分组并聚合指定的字段,分组聚合返回的数据还是DataFrame数据对象。分组条件是按月分组,分组字段为“下单时间”,应用Pandas的Groupy()函数为groupby()函数设置按月分组指令。
得到按月分组的DataFrame数据对象后,再次应用groupby()函数对数据按年分组。最后调用Pandas的ExcelWriter对象将分组数据写入EXCEL文件。
程序编码
所有程序代码放置在一个模块内,EXCEL数据文件与程序需要在同一个目录。
# 导入pandas库
import pandas as pd
# EXCEL路径
seal_path ="图书销售订单数据.xlsx"
# EXCEL输出路径
excel_path="summary.xlsx"
# 新工作表名称
sheet_name ="月汇总"
# 程序入口
if __name__ == '__main__':
# 读取EXCEL文件,读取订单工作表
df = pd.read_excel(seal_path,sheet_name='Sheet2')
# 调用DataFrame对象的groupby以字段“下单时间”按月分组
df_group=df.groupby(pd.Grouper(key="下单时间",axis=0, freq='M')).agg({"订单价格":"sum","订单编号":"count","折扣":"sum"})
# 修改索引名称
df_group = df_group.rename(columns={"订单价格":"订单总额","订单编号":"订单数量","折扣":"折扣总额"})
# 按年度分组
df_group.insert(0,"下单时间",df_group.index)
df_group=df_group.groupby(pd.Grouper(key="下单时间",freq='Y'))
# 输出到EXCEL
# 实例化ExcelWriter对象
writer = pd.ExcelWriter(excel_path)
for name,data in df_group:
data.to_excel(writer,index=False,sheet_name=str(name.year))
# 调用writer对象的save方法保存EXCEL文件
writer.save()
# 关闭文件
writer.close()
Grouper()函数允许用户为目标对象指定groupby指令,参数key为分组的字段名称,参数freq设置时间分组频率。例如:freq='Y'按年分组,freq='M'按月分组,freq='120Min'按两小时分组。