批量读取股票CSV文件并筛选最近10年数据的Python技术咨询
批量读取股票CSV文件并筛选最近10年数据的Python技术咨询
嗨,我来帮你搞定这个批量处理股票数据的问题!你的需求很明确:批量读取100多个CSV文件,每个文件保留最近10年的数据(数据不足10年的就全留),而且每个股票的日期范围还不一样。下面是具体的解决方案和代码示例:
核心思路
- 先写一个复用的函数,负责读取单份CSV+日期解析+筛选数据,这样代码更清晰,也方便后续调整。
- 用循环批量遍历所有文件名,调用上面的函数处理每一份数据,最后把结果存到列表里。
- 针对不同股票的日期差异,我们可以灵活选择“基于当前时间往前推10年”或者“基于该股票的最新日期往前推10年”两种筛选逻辑。
完整代码示例
首先导入需要的库:
import pandas as pd from datetime import datetime, timedelta
然后定义处理单份股票数据的函数:
def load_and_filter_stock_data(file_path, date_col='Date', use_data_latest=False): """ 读取股票CSV并筛选最近10年的数据 参数: file_path: CSV文件的完整路径 date_col: 日期列的名称(默认是'Date') use_data_latest: 是否基于该股票的最新日期往前推10年(默认是False,基于当前时间) 返回: 筛选后的DataFrame """ # 读取CSV,同时解析日期列 df = pd.read_csv(file_path, parse_dates=[date_col]) # 计算10年前的基准日期 if use_data_latest: # 基于当前股票数据的最新日期往前推10年(更贴合该股票的时间范围) latest_date = df[date_col].max() ten_years_ago = latest_date - timedelta(days=10*365.25) # 365.25是为了考虑闰年 else: # 基于当前系统时间往前推10年 ten_years_ago = datetime.now() - timedelta(days=10*365.25) # 筛选数据:保留基准日期之后的所有行,数据不足10年的会自动全留 filtered_df = df[df[date_col] >= ten_years_ago] return filtered_df
接下来是批量处理的循环:
# 这里替换成你的102个文件名列表(注意不需要加.csv后缀,后面会自动加) file_names = ['AAPL', 'GOOG', 'MSFT', ...] # 你的100+个股票文件名 df_list = [] for name in file_names: full_file_path = f"{name}.csv" try: # 调用函数处理,这里我选了use_data_latest=True,你可以根据需求改 processed_df = load_and_filter_stock_data(full_file_path, use_data_latest=True) df_list.append(processed_df) print(f"✅ 成功处理 {name},筛选后剩余 {len(processed_df)} 条数据") except Exception as e: # 异常处理,避免单个文件出错导致整个循环中断 print(f"❌ 处理 {name} 时出错:{str(e)}") # 如果你需要把所有数据合并成一个大DataFrame,可以用下面的代码 # merged_df = pd.concat(df_list, keys=file_names, names=['Stock', 'Index'])
关键注意事项
- 日期列解析:一定要确保
parse_dates参数正确指定日期列,否则日期会被当成字符串,无法进行比较筛选。如果你的CSV里日期格式不是YYYY-MM-DD(比如是DD/MM/YYYY),可以在pd.read_csv里加date_parser参数自定义解析格式,比如:df = pd.read_csv(file_path, parse_dates=[date_col], date_parser=lambda x: datetime.strptime(x, '%d/%m/%Y')) - 筛选逻辑选择:如果希望所有股票统一用“当前时间往前10年”,就用默认的
use_data_latest=False;如果希望每个股票基于自己的最新数据往前推10年(比如某股票最新数据是2020年,就保留2010年之后的数据),就设use_data_latest=True。 - 异常处理:加上
try-except块可以避免某个CSV文件损坏或格式错误导致整个循环崩溃,方便你定位问题文件。
备注:内容来源于stack exchange,提问作者Akshay Hedau




