使用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
相关产品推荐
相关产品推荐

