【发布时间】:2020-07-06 19:22:16
【问题描述】:
我已经阅读了许多关于在 try/except 语句、使用 else 和 finally、if/else 语句和 while 语句期间循环的 StackOverflow 线程,但它们都没有解决我想要的问题。那或者我不知道如何利用这些信息来完成我想做的事情。
基本上,我试图在给定日期调整不同公司的收盘价。我在下面的代码块中粘贴了一些虚拟数据以进行演示(注意:您必须安装 pandas 和 pandas_datareader 才能运行虚拟代码)。 get_stock_adj_close 函数返回给定代码和日期的 adj_close 价格。 dummy_dataframe 包含 4 家公司及其代码和随机日期。 add_days 函数接受一个日期并添加任意天数。我想将上市日期数据框中每家公司的调整后收盘价附加到stock_prices列表中。
因为 yahoo 股票价格数据库对于较早的条目来说不是那么可靠,并且因为某些日期落在市场收盘的日子,所以只要价格不可用,它就会引发KeyError: 'Date'。因此,我想做的是无限期地增加天数,直到找到价格确实存在的日期。问题是它只添加一天一次,然后引发相同的KeyError。我希望它继续添加天数,直到找到数据库有可用股票价格的一天,然后返回数据框并继续下一行。现在整个事情在第一个 GM 日期(第四行)中断,这引发了 KeyError 并且第五行/第二个 GM 日期被忽略。任何帮助表示赞赏!
虚拟数据:
from datetime import datetime, date, timedelta
import pandas as pd
import pandas_datareader as pdr
from dateutil.relativedelta import relativedelta
def add_days(d, num_days):
return d + timedelta(days=num_days)
def get_stock_adj_close(ticker, chosen_date):
stock_df = pdr.get_data_yahoo(ticker, start = chosen_date, end = chosen_date)
return stock_df.iloc[0]['Adj Close']
d = {'TICKER': ['AMD','AMD','CHTR','GM'], 'DATE': [datetime(2020,2,4), datetime(2019,2,8),datetime(2019,1,31), datetime(2010,4,7)]}
dummy_dataframe = pd.DataFrame(data=d)
stock_prices = []
for i, row in dummy_dataframe.iterrows():
given_date = row['DATE']
try:
stock_price = get_stock_adj_close(row['TICKER'], given_date)
print(stock_price)
stock_prices.append(stock_price)
except KeyError:
given_date = add_days(given_date,1)
stock_price = get_stock_adj_close(row['TICKER'], given_date)
stock_prices.append(stock_price)
print(stock_prices)
【问题讨论】:
标签: python pandas datetime pandas-datareader