Метка времени не отображается в пакете yfinance в Python
Я пытаюсь получать историю курсов акций с интервалом в 1 час через Yahoo Finance API, используя пакет yfinance. Я запускаю следующий код.
import yfinance as yf
msft = yf.Ticker("MSFT")
df = msft.history(period = "5d", interval = "1h")
df.reset_index(inplace = True)
print(df["Date"][0])
print(df["Date"][1])
print(df["Date"][2])
Я получаю результат
2020-04-03 00:00:00
2020-04-03 00:00:00
2020-04-03 00:00:00
Почему все отметки времени 00:00:00? Цены на акции на самом деле указаны с интервалом в 1 час и кажутся правильными. Даты тоже правильно меняются после 7 рядов. Просто отметки времени равны нулю. Я могу просто постобработать временные метки, поскольку знаю интервалы. Просто любопытно, если я здесь что-то не так делаю. Это как пакет должен работать?
2 ответа
Вы пробовали использовать "60m" в качестве аргумента интервала? Похоже, есть проблема, которую вы можете увидеть здесь: https://github.com/ranaroussi/yfinance/issues/125
Для тех, кто плохо знаком с yfinance, вот как извлечь данные из yfinance. history()
функции более подробно.
yfinance использует модуль под названием Pandas. Структуры данных, возвращаемые yfinance API, являются объектами Pandas.
Объект, возвращаемый history()
функция - это объект Pandas DataFrame. Они похожи на 2-х мерные массивы с дополнениями. Для объектов DataFrame естьcolumns
поле, которое содержит массив имен столбцов, и index
поле, которое содержит массив объектов индекса, применимых к столбцам. Индексы имеют фиксированный тип и сами могут быть объектами. В объекте DataFrame, возвращаемом yfinancehistory()
функции, индексы являются объектами Pandas Timestamp. (Pandas позволяет использовать любой тип для индексов, например, простые целые числа или строки или другие объекты также разрешены)
Существует углубленное описание панд datastructures здесь и здесь.
Каждый столбец в объекте DataFrame является объектом серии Pandas, который похож на одномерный массив. Доступ к столбцам можно получить по именам столбцов из объекта DataFrame. Доступ к значениям столбцов в каждом столбце можно получить с помощью объектов индекса. Каждый столбец использует одни и те же индексы. Обозначение массива Python[
]
может использоваться для доступа к полям в объектах Pandas.
Вот как получить доступ к данным:
def zeroX(n):
result = ""
if (n < 10):
result += "0"
result += str (n)
return result
def dump_Pandas_Timestamp (ts):
result = ""
result += str(ts.year) + "-" + zeroX(ts.month) + "-" + zeroX(ts.day)
#result += " " + zeroX(ts.hour) + ":" + zeroX(ts.minute) + ":" + zeroX(ts.second)
return result
def dump_Pandas_DataFrame (DF):
result = ""
for indexItem in DF.index:
ts = dump_Pandas_Timestamp (indexItem)
fields = ""
first = 1
for colname in DF.columns:
fields += ("" if first else ", ") + colname + " = " + str(DF[colname][indexItem])
first = 0
result += ts + " " + fields + "\n"
return result
msft = yf.Ticker("MSFT")
# get historical market data
hist = msft.history(period="1mo", interval="1d")
print ("hist = " + dump_Pandas_DataFrame(hist))
Выход:
hist = 2020-07-08 Open = 210.07, High = 213.26, Low = 208.69, Close = 212.83, Volume = 33600000, Dividends = 0, Stock Splits = 0
2020-07-09 Open = 216.33, High = 216.38, Low = 211.47, Close = 214.32, Volume = 33121700, Dividends = 0, Stock Splits = 0
2020-07-10 Open = 213.62, High = 214.08, Low = 211.08, Close = 213.67, Volume = 26177600, Dividends = 0, Stock Splits = 0
2020-07-13 Open = 214.48, High = 215.8, Low = 206.5, Close = 207.07, Volume = 38135600, Dividends = 0, Stock Splits = 0
2020-07-14 Open = 206.13, High = 208.85, Low = 202.03, Close = 208.35, Volume = 37591800, Dividends = 0, Stock Splits = 0
2020-07-15 Open = 209.56, High = 211.33, Low = 205.03, Close = 208.04, Volume = 32179400, Dividends = 0, Stock Splits = 0
2020-07-16 Open = 205.4, High = 205.7, Low = 202.31, Close = 203.92, Volume = 29940700, Dividends = 0, Stock Splits = 0
2020-07-17 Open = 204.47, High = 205.04, Low = 201.39, Close = 202.88, Volume = 31635300, Dividends = 0, Stock Splits = 0
2020-07-20 Open = 205.0, High = 212.3, Low = 203.01, Close = 211.6, Volume = 36884800, Dividends = 0, Stock Splits = 0
2020-07-21 Open = 213.66, High = 213.94, Low = 208.03, Close = 208.75, Volume = 38105800, Dividends = 0, Stock Splits = 0
2020-07-22 Open = 209.2, High = 212.3, Low = 208.39, Close = 211.75, Volume = 49605700, Dividends = 0, Stock Splits = 0
2020-07-23 Open = 207.19, High = 210.92, Low = 202.15, Close = 202.54, Volume = 67457000, Dividends = 0, Stock Splits = 0
2020-07-24 Open = 200.42, High = 202.86, Low = 197.51, Close = 201.3, Volume = 39827000, Dividends = 0, Stock Splits = 0
2020-07-27 Open = 201.47, High = 203.97, Low = 200.86, Close = 203.85, Volume = 30160900, Dividends = 0, Stock Splits = 0
2020-07-28 Open = 203.61, High = 204.7, Low = 201.74, Close = 202.02, Volume = 23251400, Dividends = 0, Stock Splits = 0
2020-07-29 Open = 202.5, High = 204.65, Low = 202.01, Close = 204.06, Volume = 19632600, Dividends = 0, Stock Splits = 0
2020-07-30 Open = 201.0, High = 204.46, Low = 199.57, Close = 203.9, Volume = 25079600, Dividends = 0, Stock Splits = 0
2020-07-31 Open = 204.4, High = 205.1, Low = 199.01, Close = 205.01, Volume = 51248000, Dividends = 0, Stock Splits = 0
2020-08-03 Open = 211.52, High = 217.64, Low = 210.44, Close = 216.54, Volume = 78983000, Dividends = 0, Stock Splits = 0
2020-08-04 Open = 214.17, High = 214.77, Low = 210.31, Close = 213.29, Volume = 49280100, Dividends = 0, Stock Splits = 0
2020-08-05 Open = 214.9, High = 215.0, Low = 211.57, Close = 212.94, Volume = 28858600, Dividends = 0, Stock Splits = 0
2020-08-06 Open = 212.34, High = 216.37, Low = 211.55, Close = 216.35, Volume = 32656800, Dividends = 0, Stock Splits = 0
2020-08-07 Open = 214.85, High = 215.7, Low = 210.93, Close = 212.48, Volume = 27789600, Dividends = 0, Stock Splits = 0