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

pandas如何匹配读取命名格式不统一的季度Excel工作表

问题根源

原代码无法运行、匹配不到目标工作表有3个核心原因:

  • 正则写法错误:正则中*代表匹配前一个字符0次或多次重复,原规则Q1*实际匹配的是Q后接0到无数个1的字符串,会误匹配Q、Q111这类内容,同时没有覆盖无空格的Qtr1/QTR1格式,也没做大小写兼容。
  • Python语法错误:if分支下的执行语句没有缩进,运行会直接抛出语法错误。
  • 匹配逻辑冗余:手动枚举所有大小写、空格组合的扩展性极差,后续遇到q1、Q 1这类新写法又需要新增判断条件。
可直接运行的方案

用统一的兼容正则一次性覆盖所有季度命名格式,同时支持批量读取多份Excel文件,按季度自动归类工作表:

import pandas as pd
import re
from pathlib import Path

# 配置数据目录,自动读取目录下所有xlsx文件
data_dir = Path("W/Energy-data/Prices/")
all_excel = list(data_dir.glob("*.xlsx"))

# 初始化季度存储字典,key为季度编号,value为对应季度的DataFrame列表
quarter_result = {1: [], 2: [], 3: [], 4: []}
# 季度匹配正则:忽略大小写,兼容Q/Qtr前缀、任意数量空格分隔的季度命名
pattern = re.compile(r"(?i)q\s*(tr)?\s*([1-4])")

for file in all_excel:
    ef = pd.ExcelFile(file)
    for sheet in ef.sheet_names:
        match = pattern.search(sheet)
        if match:
            q_num = int(match.group(2))
            df = pd.read_excel(ef, sheet_name=sheet)
            # 新增溯源字段,可根据需要保留或删除
            df["from_file"] = file.name
            df["from_sheet"] = sheet
            quarter_result[q_num].append(df)

# 直接取出对应季度的所有DataFrame即可
q1_df_list = quarter_result[1]
q2_df_list = quarter_result[2]
q3_df_list = quarter_result[3]
q4_df_list = quarter_result[4]

# 如果需要把同季度的所有工作表合并为一个DataFrame,执行concat即可
# q1_total = pd.concat(q1_df_list, ignore_index=True)

正则覆盖的命名场景

上述正则可以自动匹配所有常见季度命名格式,不需要手动枚举:

  • 不带tr前缀:Q1、q2、Q 3(Q和数字中间带空格)、Q4
  • 带tr前缀:Qtr1、QTR 2、Qtr 3(tr和数字中间带多个空格)、qTr4(大小写混合)

如果需要严格限定工作表名必须以季度标识开头,把代码里的pattern.search(sheet)改成pattern.match(sheet)即可。

内容的提问来源于stack exchange,提问作者H Hassan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.07 16:15:41