
本文介绍如何利用 python 和 pandas 从文件名中提取日期,并筛选出日期晚于指定阈值的 csv 文件路径,适用于按日期命名的日志或快照文件批量处理场景。
本文介绍如何利用 python 和 pandas 从文件名中提取日期,并筛选出日期晚于指定阈值的 csv 文件路径,适用于按日期命名的日志或快照文件批量处理场景。
在实际数据工程中,常遇到以 YYYYMMDD 格式嵌入日期的文件名(如 file_name_20240906.csv),需动态加载“某日期之后”的所有文件。原代码仅支持精确字符串匹配(如 "20240905" in loc),无法实现数值化日期比较。正确做法是:从文件路径中提取日期字符串 → 转为 datetime 类型 → 执行时间比较。
以下为推荐的完整实现方案(兼容 Windows 路径,健壮且可扩展):
import glob
import pandas as pd
import os
# 指定根目录(注意:Windows 路径使用原始字符串或双反斜杠)
base_path = r'C:\temporary_location'
pattern = os.path.join(base_path, 'file_name_*.csv')
# 获取所有匹配文件路径
file_paths = glob.glob(pattern)
# 构建 DataFrame 并提取日期部分
df = pd.DataFrame({'filepath': file_paths})
# 使用正则提取8位日期(更安全,避免格式误匹配)
df['date_str'] = df['filepath'].str.extract(r'_(\d{8})\.csv$', expand=False)
df = df.dropna(subset=['date_str']) # 过滤未匹配到日期的异常路径
# 转换为 datetime,并设置比较阈值
df['date'] = pd.to_datetime(df['date_str'], format='%Y%m%d', errors='coerce')
threshold_date = pd.Timestamp('2024-09-05') # 注意:此处为“大于”,故 09-05 不包含
# 筛选日期严格大于阈值的文件
filtered_files = df[df['date'] > threshold_date]['filepath'].tolist()
# 加载并处理每个文件
for file_path in filtered_files:
print(f'Loading: {file_path}')
try:
data = pd.read_csv(file_path, low_memory=False)
# ✅ 此处可追加业务逻辑,如合并、清洗、写入数据库等
# _frame.append(data) # 若需合并所有DataFrame,可取消注释
except Exception as e:
print(f'Error reading {file_path}: {e}')✅ 关键要点说明:
-
不依赖
in字符串匹配:避免if "20240905" in loc的歧义(如202409051也会被误匹配); -
正则提取更可靠:
r'_(\d{8})\.csv$'精准捕获下划线后8位数字+.csv,防止文件名含其他数字干扰; -
errors='coerce'处理异常:若某文件名不符合日期格式,对应date值为NaT,后续dropna可自动排除; -
使用
pd.Timestamp而非字符串比较:确保时序逻辑严谨(如跨年、闰月均无问题); -
路径兼容性:
os.path.join()自动适配不同操作系统路径分隔符。
⚠️ 注意事项:
- 确保文件名中日期格式统一为
YYYYMMDD(如20240905),否则需调整正则或format参数; - 若文件数量极大(>1000),建议改用
pathlib+ 生成器逐个解析,避免一次性构建 DataFrame 占用内存; - 生产环境建议添加日志记录和错误重试机制,而非仅
print。
通过该方法,您将精准获取 2024-09-06 至 2024-09-13 共8个文件(与预期输出完全一致),并为后续批处理奠定坚实基础。


















