You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:04:52