You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

批量读取股票CSV文件并筛选最近10年数据的Python技术咨询

批量读取股票CSV文件并筛选最近10年数据的Python技术咨询

嗨,我来帮你搞定这个批量处理股票数据的问题!你的需求很明确:批量读取100多个CSV文件,每个文件保留最近10年的数据(数据不足10年的就全留),而且每个股票的日期范围还不一样。下面是具体的解决方案和代码示例:

核心思路

  1. 先写一个复用的函数,负责读取单份CSV+日期解析+筛选数据,这样代码更清晰,也方便后续调整。
  2. 用循环批量遍历所有文件名,调用上面的函数处理每一份数据,最后把结果存到列表里。
  3. 针对不同股票的日期差异,我们可以灵活选择“基于当前时间往前推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

火山引擎 最新活动