
本文介绍如何使用 Python 和 Pandas 从文件名中提取日期(如 _20240905.csv),并筛选出日期大于指定阈值(如 2024-09-05)的所有 CSV 文件,支持完整路径处理、健壮解析与批量读取。
本文介绍如何使用 python 和 pandas 从文件名中提取日期(如 `_20240905.csv`),并筛选出日期大于指定阈值(如 2024-09-05)的所有 csv 文件,支持完整路径处理、健壮解析与批量读取。
在实际数据处理场景中,常需按时间维度动态加载一批命名含日期的 CSV 文件(例如 file_name_20240901.csv)。原始代码仅通过字符串匹配(如 "20240905" in loc)做精确匹配,无法实现“大于某日期”的逻辑判断。要正确实现日期比较,关键在于:将文件名中的日期字符串解析为真正的 datetime 类型,再进行数值化比较。
以下是一个专业、可复用的解决方案:
从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。
✅ 正确做法:用 pd.to_datetime 提取并解析日期
import glob
import pandas as pd
import os
# 指定根路径(注意:Windows 路径建议用 raw string 或正向斜杠)
_path = r'C:\temporary_location'
# 获取所有 CSV 文件的完整路径
all_files = glob.glob(os.path.join(_path, 'file_name_*.csv'))
# 构建 DataFrame 并提取日期部分(假设日期格式为 YYYYMMDD,位于文件名末尾)
df = pd.DataFrame({'filepath': all_files})
# 使用正则提取 8 位数字日期(更鲁棒,避免路径干扰)
df['date_str'] = df['filepath'].str.extract(r'_(\d{8})\.csv$', expand=False)
# 将字符串转为 datetime;format 指定格式,exact=False 允许在字符串中任意位置匹配
df['date'] = pd.to_datetime(df['date_str'], format='%Y%m%d', errors='coerce')
# 过滤:日期严格大于指定阈值(自动处理时区与类型转换)
cutoff_date = pd.Timestamp('2024-09-05')
filtered_files = df[df['date'] > cutoff_date]['filepath'].tolist()
print("✅ 匹配到以下文件(日期 > 2024-09-05):")
for f in sorted(filtered_files): # 推荐排序以保证时间顺序
print(f)✅ 输出示例(按字典序或
sorted()后):✅ 匹配到以下文件(日期 > 2024-09-05): C:\temporary_location\file_name_20240906.csv C:\temporary_location\file_name_20240907.csv ... C:\temporary_location\file_name_20240913.csv
⚠️ 注意事项与最佳实践
-
不要直接字符串比较日期:
"20240906" > "20240905"虽然在此例中成立,但不具通用性(如"20241001" 字符串比较会错误);必须转为 <code>datetime才能保证语义正确。 -
路径安全处理:使用
os.path.join()或pathlib.Path替代手动拼接\,避免跨平台问题。 -
容错性增强:
errors='coerce'可将无法解析的日期转为NaT(Not a Time),避免程序中断;后续可用df.dropna(subset=['date'])清洗。 -
性能提示:若文件极多,可改用
pathlib+re预筛选再解析,减少 DataFrame 构建开销;但对百级文件,上述方法简洁高效。 -
扩展建议:若需批量读取并合并,可在循环中追加
pd.read_csv(f)到列表,最后pd.concat(..., ignore_index=True)。
该方法兼顾可读性、健壮性与工程实践,是处理时间序列命名文件的标准范式。

















