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

如何在for循环中将多个DataFrame导出至同一Excel工作簿的不同工作表?

问题分析与解决方案

看起来你的代码里有几个关键问题导致无法生成第二个SMA对应的工作表,我来帮你拆解并修正:

1. 无用且干扰的变量赋值

你代码里的instrument=+1和MA=+1完全是多余的——for循环会自动遍历列表中的元素,手动修改循环变量不仅没用,还可能在某些场景下干扰循环逻辑,直接删掉这两行就好。

2. 未重置结果DataFrame

你在循环外初始化了resultsDF,第一个MA(20)循环结束后,这个DF已经存储了两个instrument的数据。当进入第二个MA(50)循环时,你会继续往同一个DF里追加数据,这不仅会导致数据混淆,还可能如果内层循环出现异常,直接终止整个MA循环,导致第二个工作表无法生成。

正确的做法是在每个MA循环的开头重新初始化resultsDF,确保每个MA对应的工作表数据都是独立的。

3. 推荐使用pd.concat替代append

DataFrame.append()已经被官方弃用了,改用pd.concat()更符合当前pandas的最佳实践。

修正后的完整代码

import pandas as pd

instrument_list = ["AUD_JPY", "AUD_USD"]  # 变量名不要用list,这是Python内置类型
granularity = "D"
bar_count = 5000
MA_list = [20, 50]

# 使用with语句管理ExcelWriter,自动处理保存和关闭
with pd.ExcelWriter('BT.xlsx') as writer:
    for MA in MA_list:
        # 每个MA循环开始时,重新初始化空的resultsDF
        resultsDF = pd.DataFrame(columns=['instrument', 'Start date', 'End date'])
        for instrument in instrument_list:
            # 这里放你的数据计算逻辑,比如获取startDate和endDate的代码
            # ...(你的原有计算代码)
            
            # 示例模拟数据,你可以替换成真实计算结果
            startDate = "2023-01-01"
            endDate = "2024-01-01"
            
            # 用pd.concat替代append
            new_row = pd.DataFrame({'instrument': [instrument], 'Start date': [startDate], 'End date': [endDate]})
            resultsDF = pd.concat([resultsDF, new_row], ignore_index=True)
        
        # 将当前MA对应的DF导出到指定工作表
        sheet_name = f'Price_Over_SMA{MA}_{granularity}'
        resultsDF.to_excel(writer, sheet_name=sheet_name, index=False)  # 加上index=False可以避免导出索引列

额外建议

  • 不要用list作为变量名,这会覆盖Python的内置list类型,改用instrument_list这类更清晰的名字。
  • 使用f-string格式化工作表名称比format()更简洁易读。
  • 加上index=False可以避免把DataFrame的索引列导出到Excel里,让表格更干净。

这样修改后,代码会为每个MA值生成独立的工作表,每个工作表里包含所有instrument的计算结果,完全符合你的需求。

内容的提问来源于stack exchange,提问作者cadig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:07:07