You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于日期合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:35:11