如何从 yfinance 获取特定时间和日期的 1 分钟价格数据?
Posted
技术标签:
【中文标题】如何从 yfinance 获取特定时间和日期的 1 分钟价格数据?【英文标题】:how to get 1 minute price data of a specific time and date from yfinance? 【发布时间】:2021-12-09 17:43:10 【问题描述】:我想知道如何获取1分钟黄金价格数据特定时间和日期间隔(如10月18日1小时间隔:2021-10 -18 09:30:00 到 2021-10-18 10:30:00) 来自 yfinance 或 python 中的任何其他来源?
我的代码是:
gold = yf.download(tickers="GC=F", period="5d", interval="1m")
似乎可以设置期间,而我想设置特定的日期和时间间隔。 谢谢
【问题讨论】:
1分钟单位的数据只能获取7天。 【参考方案1】:编辑 2021-10-25
清除我的答案。问题是:
我想设置特定的日期和时间间隔。谢谢
您需要的只是代码文档。
所以start
和end
可以是日期或_datetime
start: str
Download start date string (YYYY-MM-DD) or _datetime.
Default is 1900-01-01
示例代码:
注意:时区有问题,我尝试通过 start 和 end 传递正确的时区,但 lib 没有正确处理它,我手动完成了转换)
import pandas as pd
import yfinance as yf
import pendulum
pd.options.display.max_rows=10 # To decrease printouts
start = pendulum.parse('2021-10-18 09:30').add(hours=7) # My tz is UTC+03:00, original TZ UTC-04:00. So adds to my local time 7 hours
end = pendulum.parse('2021-10-18 10:30').add(hours=7) # Same
print(start)
print(yf.download(tickers="GC=F", interval="1m", start=start, end=end))
结果,您可以传递您想要的任何日期时间范围:
2021-10-18T16:30:00+00:00
[*********************100%***********************] 1 of 1 completed
Open High Low Close \
Datetime
2021-10-18 09:30:00-04:00 1770.099976 1770.099976 1767.400024 1767.800049
2021-10-18 09:31:00-04:00 1767.900024 1769.099976 1767.800049 1768.500000
2021-10-18 09:32:00-04:00 1768.599976 1769.300049 1768.199951 1769.199951
2021-10-18 09:33:00-04:00 1769.300049 1770.199951 1768.900024 1769.099976
2021-10-18 09:34:00-04:00 1769.199951 1769.300049 1767.599976 1767.800049
... ... ... ... ...
2021-10-18 10:25:00-04:00 1769.900024 1770.400024 1769.800049 1770.300049
2021-10-18 10:26:00-04:00 1770.300049 1770.500000 1769.900024 1769.900024
2021-10-18 10:27:00-04:00 1769.800049 1769.800049 1769.099976 1769.400024
2021-10-18 10:28:00-04:00 1769.400024 1770.400024 1769.400024 1770.199951
2021-10-18 10:29:00-04:00 1770.300049 1771.000000 1769.900024 1770.099976
Adj Close Volume
Datetime
2021-10-18 09:30:00-04:00 1767.800049 0
2021-10-18 09:31:00-04:00 1768.500000 459
2021-10-18 09:32:00-04:00 1769.199951 428
2021-10-18 09:33:00-04:00 1769.099976 750
2021-10-18 09:34:00-04:00 1767.800049 549
... ... ...
2021-10-18 10:25:00-04:00 1770.300049 134
2021-10-18 10:26:00-04:00 1769.900024 147
2021-10-18 10:27:00-04:00 1769.400024 349
2021-10-18 10:28:00-04:00 1770.199951 258
2021-10-18 10:29:00-04:00 1770.099976 382
[60 rows x 6 columns]
PS:start
和 end
没有过去 7 天的限制,但仍然有过去 30 天的限制:
1 Failed download:
- GC=F: 1m data not available for startTime=1631980800 and endTime=1631998800. The requested range must be within the last 30 days.
原创
这个库缺少文档。但这是 python,因此它是某种自我记录的。
在此处阅读下载功能的定义 https://github.com/ranaroussi/yfinance/blob/6654a41a8d5c0c9e869a9b9acb3e143786c765c7/yfinance/multi.py#L32
PS这个函数有start=
和end=
参数希望对你有帮助
【讨论】:
开始和结束只接受日期。 OP 已要求时间范围之间的能力。这没有回答问题 @PacketLoss 这是不正确的。它是接受一个日期时间。请看看我的更新。【参考方案2】:您对yfinance
的调用会返回一个以datetime
为索引的Pandas DataFrame
。我们可以使用它来过滤数据帧以仅在 start
和 end
时间之间的条目。
import yfinance as yf
from datetime import datetime
gold = yf.download(tickers="GC=F", period="5d", interval="1m")
start = datetime(2021, 10, 18, 9, 30, 0)
end = datetime(2021, 10, 18, 10, 30, 0)
filtered = gold[start: end]
输出
Open High ... Adj Close Volume
Datetime ...
2021-10-18 09:30:00-04:00 1770.099976 1770.099976 ... 1767.599976 1035
2021-10-18 09:31:00-04:00 1767.900024 1769.099976 ... 1768.500000 467
2021-10-18 09:32:00-04:00 1768.599976 1769.300049 ... 1769.199951 428
2021-10-18 09:33:00-04:00 1769.300049 1770.199951 ... 1769.099976 750
2021-10-18 09:34:00-04:00 1769.199951 1769.300049 ... 1767.800049 549
... ... ... ... ... ...
2021-10-18 10:26:00-04:00 1770.300049 1770.500000 ... 1769.900024 147
2021-10-18 10:27:00-04:00 1769.800049 1769.800049 ... 1769.400024 349
2021-10-18 10:28:00-04:00 1769.400024 1770.400024 ... 1770.199951 258
2021-10-18 10:29:00-04:00 1770.300049 1771.000000 ... 1770.099976 382
2021-10-18 10:30:00-04:00 1770.300049 1771.000000 ... 1770.900024 180
[61 rows x 6 columns]
【讨论】:
谢谢。如果我想从 i.g. 获得这样的 1 小时间隔数据连续 7 天或 30 天,你知道怎么做吗? 只需修改您的yfinance
下载以延长期限和更改间隔。只要您下载了正确的日期范围,您就可以在返回的结果中简单地过滤您的数据
所以对于 30 天的数据,我应该使用 for 循环运行 30 次过滤?!没有更简单的方法吗?
@muhamad 请看看我的更新。您可以将 start 和 end 作为日期时间传递,并获取过去 30 天内所需的任何数据范围。以上是关于如何从 yfinance 获取特定时间和日期的 1 分钟价格数据?的主要内容,如果未能解决你的问题,请参考以下文章
当我从 api (yfinance) 获取数据时,Numpy Array 缺少日期
yfinance - 将我的结束日期设置为 2021-1-1,但数据的结束日期变为今天日期