
本文介绍如何将多个股票csv文件读取为pandas dataframe,为每份数据添加股票代码(symbol)列,合并为单一dataframe,并按date列升序排序。方法简洁高效,支持任意数量的股票文件。
本文介绍如何将多个股票csv文件读取为pandas dataframe,为每份数据添加股票代码(symbol)列,合并为单一dataframe,并按date列升序排序。方法简洁高效,支持任意数量的股票文件。
在量化分析或金融数据处理中,常需批量加载多只股票的历史行情(如AAPL、TSLA、GOOG),每只股票存于独立CSV文件中,结构一致(含Date、Open、High、Low、Close、Volume等列)。目标是:统一添加symbol标识列 → 合并为单个DataFrame → 按Date全局排序。以下是三种推荐实现方式,均基于pandas.concat(),兼顾可读性与性能。
✅ 推荐方案一:列表推导式 + assign()(最清晰易维护)
import pandas as pd
sym_list = ['AAPL', 'TSLA', 'GOOG']
dfs = []
for symbol in sym_list:
print(f"Loading {symbol}...")
df = pd.read_csv(fr'./data/{symbol}.csv').assign(symbol=symbol) # 添加symbol列
dfs.append(df)
final_df = pd.concat(dfs, ignore_index=True).sort_values('Date', ignore_index=True)
✅ 优点:逻辑直观、调试友好(可逐个检查df)、兼容旧版Pandas;
⚠️ 注意:ignore_index=True 在 concat 和 sort_values 中均需显式指定,避免索引重复或错乱(原答案中误写为 igore_index,已修正)。
✅ 方案二:一行式列表推导(适合脚本化)
final_df = (
pd.concat([
pd.read_csv(fr'./data/{symbol}.csv').assign(symbol=symbol)
for symbol in sym_list
], ignore_index=True)
.sort_values('Date', ignore_index=True)
)
✅ 方案三:字典推导式 + 多级索引处理(进阶用法)
# 先以symbol为键构建MultiIndex DataFrame
temp_df = pd.concat({
symbol: pd.read_csv(fr'./data/{symbol}.csv')
for symbol in sym_list
})
# 去除第二级索引(原行号),将第一级(symbol)转为普通列
final_df = (temp_df
.droplevel(1) # 删除原DataFrame内部索引
.rename_axis('symbol') # 将外层索引名设为'symbol'
.reset_index() # 索引转列
.sort_values('Date', ignore_index=True))
? 此法隐含了symbol列的自动对齐,但需注意:若各CSV行数巨大,droplevel+reset_index可能略慢于方案一。
? 关键注意事项
-
日期列类型:确保Date列为datetime64类型,否则排序可能异常。建议在read_csv中加入解析:
pd.read_csv(..., parse_dates=['Date'], infer_datetime_format=True)
- 缺失值与格式一致性:合并前建议验证各CSV列名是否完全一致(df.columns.equals()),避免concat报错。
- 内存优化:处理大量文件时,可在循环中使用chunksize或dtype参数控制内存占用,例如指定dtype={'Open': 'float32'}。
最终得到的 final_df 是一个扁平化DataFrame,包含原始所有列(Date、Open、High…)及新增的symbol列,且所有记录按Date升序排列,可直接用于时间序列分析、回测或可视化。











