yfinance下载TSLA6个月1分钟数据返回空表,求限制规则及解决方案
yfinance获取TSLA分钟级数据的限制与解决方法
问题背景
尝试用yfinance下载特斯拉(TSLA)6个月的1分钟分辨率数据时返回空DataFrame,相关测试代码如下:
symbol_history = yf.Ticker('TSLA').history(period='1d', interval='1m') # 正常返回数据 symbol_history = yf.Ticker('TSLA').history(period='max', interval='1m') # 正常返回6天数据 symbol_history = yf.Ticker('TSLA').history(period='6mo', interval='1m') # 返回空DataFrame
核心原因:period与interval的组合限制
yfinance对period(周期)和interval(数据间隔)的组合有严格限制,这是因为其依赖的数据源本身不提供超长时间范围的高频分钟数据。其中1分钟级数据的最大可获取周期约为7天,超过这个范围调用就会返回空DataFrame。
解决方法:分批次获取并合并
要获取6个月的1分钟数据,需要将整个时间段拆分成多个7天的小周期,通过指定start和end参数分批次获取,再合并结果。
示例代码如下:
import yfinance as yf import pandas as pd from datetime import datetime, timedelta import time # 定义时间范围:过去6个月 start_date = datetime.now() - timedelta(days=180) end_date = datetime.now() current_date = start_date # 初始化空DataFrame存储所有数据 all_tsla_data = pd.DataFrame() while current_date < end_date: # 每个批次最多取7天数据 batch_end = min(current_date + timedelta(days=7), end_date) # 获取当前批次的1分钟数据 batch_data = yf.Ticker('TSLA').history(start=current_date, end=batch_end, interval='1m') # 合并到总数据中 all_tsla_data = pd.concat([all_tsla_data, batch_data]) # 更新当前起始日期 current_date = batch_end # 加1秒延迟避免触发接口限流 time.sleep(1) # 去重(可选,处理批次首尾可能的重复数据) all_tsla_data = all_tsla_data.drop_duplicates() # 重置索引(可选) all_tsla_data = all_tsla_data.reset_index()
内容的提问来源于stack exchange,提问作者mece1390
相关产品推荐
相关产品推荐

