如何用Pandas提取Excel水电暖数据并生成月度汇总表格?
解决方案:整理公用事业费用数据并在Tkinter展示表格
一、数据整理(Pandas部分)
将每个月份sheet的零散数据转换成目标格式,解决类型识别、月份排序和隔月水费的问题:
核心步骤代码
import pandas as pd # 读取所有月份sheet(你已完成此步骤,这里仅作示例) sheet_dict = pd.read_excel("your_utility_data.xlsx", sheet_name=None) # 定义月份排序的固定顺序,确保按时间排序而非字母顺序 month_order = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] # 初始化结果DataFrame final_df = pd.DataFrame() # 遍历每个月份的sheet数据 for month_name, raw_df in sheet_dict.items(): # 1. 过滤出三类公用事业数据(根据你的实际列名调整,这里假设列名为"Utility_Type") filtered_df = raw_df[raw_df["Utility_Type"].isin(["Heating", "Electricity", "Water"])].copy() # 2. 将行数据转成列(宽表格式),一个月内同类型账单自动求和 monthly_summary = filtered_df.pivot_table( index=[pd.Series([month_name]*len(filtered_df))], # 行索引设为当前月份 columns="Utility_Type", values="Expense", # 费用列名,替换成你的实际列名 aggfunc="sum" ) # 3. 合并到最终结果 final_df = pd.concat([final_df, monthly_summary]) # 4. 设置月份分类,强制按时间顺序排序 final_df.index = pd.Categorical(final_df.index, categories=month_order, ordered=True) final_df = final_df.sort_index() # 5. 处理隔月水费:空值填充为0(或pd.NA显示空) final_df = final_df.fillna(0).round(2)
适配不同原始数据格式
如果你的原始数据没有明确的Utility_Type列,可通过关键词识别行:
# 假设通过"Description"列的关键词判断类型 filtered_df = pd.DataFrame() # 匹配供暖数据 heating_rows = raw_df[raw_df["Description"].str.contains("供暖|Heating", case=False)] heating_rows["Utility_Type"] = "Heating" # 匹配电力数据 electricity_rows = raw_df[raw_df["Description"].str.contains("电力|Electricity", case=False)] electricity_rows["Utility_Type"] = "Electricity" # 匹配水费数据 water_rows = raw_df[raw_df["Description"].str.contains("水费|Water", case=False)] water_rows["Utility_Type"] = "Water" # 合并三类数据 filtered_df = pd.concat([heating_rows, electricity_rows, water_rows])
二、Tkinter表格展示
用ttk.Treeview实现表格展示,支持滚动和格式化:
import tkinter as tk from tkinter import ttk def show_utility_table(data_df): # 创建主窗口 root = tk.Tk() root.title("公用事业费用统计") root.geometry("600x400") # 创建Treeview表格 tree = ttk.Treeview(root) # 设置列:第一列是月份,后续是三类费用 columns = ["月份"] + list(data_df.columns) tree["columns"] = columns tree["show"] = "headings" # 隐藏默认空列 # 配置表头和列宽 for col in columns: tree.heading(col, text=col) tree.column(col, width=150, anchor="center") # 插入数据行 for month, row_data in data_df.iterrows(): # 组装月份+费用的元组 row_values = (month,) + tuple(row_data) tree.insert("", tk.END, values=row_values) # 添加垂直滚动条 scrollbar = ttk.Scrollbar(root, orient="vertical", command=tree.yview) tree.configure(yscroll=scrollbar.set) scrollbar.pack(side="right", fill="y") tree.pack(fill="both", expand=True) root.mainloop() # 调用展示函数 show_utility_table(final_df)
关键说明
- 月份排序:通过
pd.Categorical强制按自定义顺序排序,替代字母排序的问题 - 隔月水费:用
fillna()处理空值,可根据需求选择填充0或保留空值 - 扩展性:即使后续月份增加,代码会自动遍历新的sheet,无需修改核心逻辑
内容的提问来源于stack exchange,提问作者GaryC
相关产品推荐
相关产品推荐

