基于日期合并Metastock导出股票Excel数据时遇NaN问题求助
问题分析与解决方案
原代码合并后全为NaN的核心问题有三个:
- 文件路径错误:
os.listdir仅返回文件名,未拼接目标文件夹路径,导致读取Excel时找不到文件(除非当前工作目录恰好是目标文件夹) - 日期列被错误覆盖:把主DataFrame的
DATE列强制赋值给子数据的DATE,导致子数据的日期和自身行情数据完全不对应 - 索引不匹配:主DataFrame用默认整数索引,子数据却以
DATE为索引做join,两者索引类型完全不同,自然无法匹配
修正后的代码
import pandas as pd from pathlib import Path # 定义目标文件夹路径,用Path类处理路径更可靠 folder_path = Path(r'C:\Users\Eng\Desktop\out') # 直接获取所有XLS格式文件的完整路径 files_xls = list(folder_path.glob('*.XLS')) # 初始化主DataFrame,以指定日期范围作为索引 df = pd.DataFrame(index=pd.date_range(start='01/01/1998', end='06/06/2023')) for file in files_xls: # 读取Excel文件,跳过首行,使用完整路径避免找不到文件 data = pd.read_excel(file, skiprows=[0]) # 获取股票名称并重命名收盘价列 stock_name = file.stem close_col_name = f'{stock_name}CLOSE' data.rename(columns={'CLOSE': close_col_name}, inplace=True) # 只保留需要的列:日期和对应的收盘价 data = data[['DATE', close_col_name]] # 将子数据的日期列转为datetime类型,确保格式统一 data['DATE'] = pd.to_datetime(data['DATE'], format="%m/%d/%Y") # 将日期设为索引,方便按日期匹配合并 data.set_index('DATE', inplace=True) # 按日期索引左连接,保留主表所有日期,缺失行情的日期显示NaN df = df.join(data, how='left') # 可选:将索引转回普通DATE列(如果不需要日期作为索引) df.reset_index(names='DATE', inplace=True)
关键修改说明
- 用
Path.glob直接获取带完整路径的文件,彻底解决路径问题 - 主表直接以日期范围为索引,后续join时自动按日期匹配
- 保留子数据自身的
DATE列并格式化,确保日期和行情数据对应 - 显式保留必要列,避免多余数据干扰合并逻辑
- 左连接保证主表所有日期都被保留,符合多股票行情合并的常规需求
内容的提问来源于stack exchange,提问作者Mina nabil
相关产品推荐
相关产品推荐

