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

使用to_hdf下载金融数据时文件体积持续增大的原因排查

问题原因与解决方案

问题根源

你遇到的文件体积持续增大的问题,核心原因是**Df_list没有在每个股票代码(ticker)处理时重置**。在main()中初始化的Df_list是全局共享的列表,每处理一个新ticker时,你会把该ticker的数据追加到这个列表中,再将整个列表拼接成DataFrame保存。这意味着第N个文件会包含前N-1个ticker的所有数据,导致文件体积随处理数量线性增长。

修复代码

只需在ticker_data函数的ticker循环内部重新初始化Df_list,确保每个ticker的数据独立存储:

import pandas as pd
import datetime as dt
import yfinance as yf
from pandas.tseries.holiday import USFederalHolidayCalendar
import yahoo_fin.stock_info as si
from pathlib import Path
import os.path


def main():
    end = dt.datetime.now()

    start = end + dt.timedelta(days=-5)

    dr = pd.date_range(start=start, end=end)
    cal = USFederalHolidayCalendar()
    holidays = cal.holidays(start=dr.min(), end=dr.max())
    a = dr[~dr.isin(holidays)] # 排除美国节假日
    b = a[a.weekday != 5]
    b = b[b.weekday != 6]

    for year in set(b.year):
        tmp = b[b.year == year]
        for week in set(pd.Index(tmp.isocalendar().week)):
            temp = tmp[pd.Index(tmp.isocalendar().week) == week]
            start = temp[temp.weekday == temp.weekday.min()][0]  # 每周开始日期
            end = temp[temp.weekday == temp.weekday.max()][0]  # 每周结束日期

    # 获取标普500成分股列表
    ticker_strings = si.tickers_sp500()

    data_dir = 'data'

    x = 1

    tickers_dir = './tickers'

    Index = '^GSPC'

    ticker_data(ticker_strings, start, end, data_dir, x)

    print("Complete")


def ticker_data(ticker_strings, start, end, data_dir, x):
    # 处理单个股票数据
    for ticker in ticker_strings:
        # 关键修复:每个ticker单独初始化列表,避免数据累积
        Df_list = list()
        loc_start = start
        while loc_start <= end:
            period_end = loc_start + dt.timedelta(days=1)
            intra_day_data = yf.download(ticker, loc_start, period_end, period="1d", interval="1m")
            extra_day_data = yf.download(ticker, loc_start, period_end, period="1d", interval="1m", prepost=True)
            Df_list.append(intra_day_data)
            Df_list.append(extra_day_data)
            loc_start = loc_start + dt.timedelta(days=1)
        df = pd.concat(Df_list)

        # 生成文件名
        filename = end.strftime('%F') + " " + ticker + ".h5"
        # 保存到指定目录
        df.to_hdf(os.path.join(data_dir, filename), mode='w', key='df')
        #df.to_csv(os.path.join(data_dir, filename))

        print(x, ticker)
        x += 1


if __name__ == "__main__":
    main()

额外说明

  • Python中列表是可变对象,传递的是引用而非副本。之前的代码中Df_list被持续追加数据,导致每个新文件都包含所有历史ticker的数据。
  • 修复后,每个ticker的DataFrame仅包含自身的日内及盘前盘后数据,文件体积会保持在相近水平(约200KB左右,具体取决于数据量)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:25:12