如何使用Python合并文件夹中上个季度的文件
用Python合并目录中上季度文件的解决方案
一、先搞定「上个季度」的时间筛选
首先得明确哪些文件属于上个季度,分两种场景处理:
1. 根据文件修改时间筛选
用datetime和calendar模块计算上个季度的起止日期,再遍历目录判断文件修改时间是否在范围内:
import os import datetime import calendar import pandas as pd # 计算上个季度的起止日期 today = datetime.date.today() current_quarter = (today.month - 1) // 3 + 1 last_quarter = current_quarter - 1 if current_quarter > 1 else 4 last_year = today.year if current_quarter > 1 else today.year - 1 # 确定季度的起始、结束月份 start_month = (last_quarter - 1) * 3 + 1 end_month = last_quarter * 3 # 获取季度第一天和最后一天 start_date = datetime.date(last_year, start_month, 1) end_date = datetime.date(last_year, end_month, calendar.monthrange(last_year, end_month)[1]) # 遍历目录筛选目标文件 target_files = [] dir_path = "./your_target_dir" # 替换成你的目标目录路径 for filename in os.listdir(dir_path): file_path = os.path.join(dir_path, filename) if os.path.isfile(file_path): # 把文件修改时间转为date格式 modify_time = datetime.date.fromtimestamp(os.path.getmtime(file_path)) if start_date <= modify_time <= end_date: target_files.append(file_path)
2. 根据文件名中的季度标识筛选
如果文件名里有Q3_2024、2024Q3这类季度标识,直接匹配筛选:
# 生成上个季度的标识字符串,根据你的文件名格式调整 quarter_tag = f"Q{last_quarter}_{last_year}" # 也可以改成f"{last_year}Q{last_quarter}",看实际文件名规则 target_files = [ os.path.join(dir_path, f) for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f)) and quarter_tag in f ]
二、用Pandas批量合并文件
筛选出目标文件后,批量读取并合并,同时处理常见格式问题:
# 初始化空的总DataFrame merged_df = pd.DataFrame() for file in target_files: # 根据文件格式选择读取方法 if file.endswith(".csv"): # 可选:添加on_bad_lines='skip'跳过格式错误的行 df = pd.read_csv(file, on_bad_lines='skip') elif file.endswith((".xlsx", ".xls")): df = pd.read_excel(file) else: print(f"跳过不支持的文件:{file}") continue # 可选:添加来源文件名列,方便后续溯源 df["source_file"] = os.path.basename(file) # 合并到总表 merged_df = pd.concat([merged_df, df], ignore_index=True) # 保存合并后的结果 merged_df.to_csv("./merged_last_quarter.csv", index=False) # 如需Excel格式:merged_df.to_excel("./merged_last_quarter.xlsx", index=False)
三、常见问题解决
- 列名不统一:读取时用
usecols指定固定列,或者用df.rename()统一列名后再合并 - 内存不足:处理大文件时用
chunksize分块读取,比如pd.read_csv(file, chunksize=10000),逐块合并 - 空值异常:读取时添加
na_values参数指定空值标识,或者合并后用df.dropna()/df.fillna()处理
内容的提问来源于stack exchange,提问作者Aparna Yadav
相关产品推荐
相关产品推荐

