如何基于共用日期列合并多只股票的CSV文件?
解决股票CSV文件合并问题
问题根源
你的代码有两个核心问题导致合并失败:
- 文件路径错误:
os.listdir(path)仅返回文件名,直接用pd.read_csv(file)读取时,会在当前工作目录(而非Stock子文件夹)查找文件,导致读取的文件可能不对或找不到。 - 合并逻辑错误:每次循环中
df = pd.concat([df_temp], ...)会用当前单个股票的DataFrame覆盖之前的df,而非累加合并所有股票数据。
修正后的代码
from google.colab import drive drive.mount('/content/drive') import numpy as np import os import pandas as pd # 指向Stock文件夹的路径 path = "/content/drive/MyDrive/Stock" files = os.listdir(path) # 初始化列表存储每个股票的DataFrame stock_dfs = [] for file in files: if file.endswith(".csv"): # 拼接完整文件路径 full_file_path = os.path.join(path, file) # 读取CSV,解析日期为datetime类型,以Date为索引 df_temp = pd.read_csv( full_file_path, usecols=['Adj Close', 'Date'], index_col='Date', parse_dates=['Date'] # 确保日期格式统一,保证索引对齐 ) # 将Adj Close列重命名为股票文件名(可选择去除.csv后缀) stock_name = file.replace('.csv', '') df_temp.rename(columns={'Adj Close': stock_name}, inplace=True) # 将当前股票DataFrame加入列表 stock_dfs.append(df_temp) # 合并所有股票DataFrame,按列拼接 merged_df = pd.concat(stock_dfs, axis=1, join='outer') # join='inner'可只保留所有股票共有的日期 # 展示合并结果 display(merged_df) # 可选:将合并结果保存为新CSV merged_df.to_csv("/content/drive/MyDrive/Stock/merged_stocks.csv")
关键修正点说明
- 正确获取文件路径:用
os.path.join(path, file)拼接完整路径,确保读取的是Stock文件夹下的目标文件。 - 批量收集再合并:先将每个股票的DataFrame存入列表,最后一次性合并,避免循环中覆盖数据,同时提升效率。
- 日期解析:添加
parse_dates=['Date']将日期转为datetime类型,确保不同股票的日期索引能正确对齐(即使某些股票缺失部分日期)。 - 列名优化:去除文件名的
.csv后缀,让结果列名更简洁。 - 合并方式选择:
join='outer'保留所有股票的所有日期(缺失值用NaN填充),若只需所有股票共有的日期,改为join='inner'即可。
最终效果
合并后的DataFrame会呈现你需要的格式:
| Date | Stock A | Stock B |
|---|---|---|
| 2023-01-01 | 123.45 | 67.89 |
| 2023-01-02 | 124.56 | 68.90 |
内容的提问来源于stack exchange,提问作者amy
相关产品推荐
相关产品推荐

