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
相关产品推荐
相关产品推荐

