在 try/except 语句出现异常时继续
Continuing during an exception in a try/except statement
我已经阅读了许多关于在 try/except 语句期间循环、使用 else 和最后 if/else 语句以及 while 语句的 Whosebug 线程,但是其中 none 解决了我想要的问题。那或者我不知道如何利用这些信息来完成我想做的事情。
基本上,我正在尝试获取给定日期各家公司调整后的收盘价。我在下面的代码块中粘贴了一些虚拟数据以进行演示(注意:您必须安装 pandas 和 pandas_datareader 才能将虚拟代码设置为 运行)。 get_stock_adj_close
函数 return 是给定代码和日期的 adj_close 价格。 dummy_dataframe
包含 4 家公司及其代码和随机日期。 add_days
函数接受一个日期并添加任意天数。我想将上市日期数据框中每家公司的调整后收盘价附加到 stock_prices
列表中。
因为雅虎股票价格数据库对于较旧的条目并不那么可靠,并且因为某些日期恰逢市场休市日,所以只要没有可用的价格,它就会提高 KeyError: 'Date'
。因此,我想做的是无限期地增加天数,直到找到价格确实存在的日期。问题是它只添加了一天,然后又增加了相同的 KeyError
。我希望它继续增加天数,直到找到数据库有可用股票价格的那一天,然后 return 返回数据框并继续处理下一行。现在整个事情在第一个 GM 日期(第四行)中断,这引发了 KeyError
和第五个 row/second 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)
我认为 while 循环会对您有所帮助。例如:
for i, row in dummy_dataframe.iterrows():
given_date = row['DATE']
stock_price_found = False
while not stock_price_found:
try:
stock_price = get_stock_adj_close(row['TICKER'], given_date)
print(stock_price)
stock_prices.append(stock_price)
stock_price_found = False
except KeyError:
given_date = add_days(given_date,1)
或者你也可以使用 while True 和 break:
for i, row in dummy_dataframe.iterrows():
given_date = row['DATE']
while True:
try:
stock_price = get_stock_adj_close(row['TICKER'], given_date)
print(stock_price)
stock_prices.append(stock_price)
break
except KeyError:
given_date = add_days(given_date,1)
不要忘记确保您没有陷入无限循环,这对 while 循环的一些其他退出条件也有帮助,例如,在 10 次失败之后。
我已经阅读了许多关于在 try/except 语句期间循环、使用 else 和最后 if/else 语句以及 while 语句的 Whosebug 线程,但是其中 none 解决了我想要的问题。那或者我不知道如何利用这些信息来完成我想做的事情。
基本上,我正在尝试获取给定日期各家公司调整后的收盘价。我在下面的代码块中粘贴了一些虚拟数据以进行演示(注意:您必须安装 pandas 和 pandas_datareader 才能将虚拟代码设置为 运行)。 get_stock_adj_close
函数 return 是给定代码和日期的 adj_close 价格。 dummy_dataframe
包含 4 家公司及其代码和随机日期。 add_days
函数接受一个日期并添加任意天数。我想将上市日期数据框中每家公司的调整后收盘价附加到 stock_prices
列表中。
因为雅虎股票价格数据库对于较旧的条目并不那么可靠,并且因为某些日期恰逢市场休市日,所以只要没有可用的价格,它就会提高 KeyError: 'Date'
。因此,我想做的是无限期地增加天数,直到找到价格确实存在的日期。问题是它只添加了一天,然后又增加了相同的 KeyError
。我希望它继续增加天数,直到找到数据库有可用股票价格的那一天,然后 return 返回数据框并继续处理下一行。现在整个事情在第一个 GM 日期(第四行)中断,这引发了 KeyError
和第五个 row/second 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)
我认为 while 循环会对您有所帮助。例如:
for i, row in dummy_dataframe.iterrows():
given_date = row['DATE']
stock_price_found = False
while not stock_price_found:
try:
stock_price = get_stock_adj_close(row['TICKER'], given_date)
print(stock_price)
stock_prices.append(stock_price)
stock_price_found = False
except KeyError:
given_date = add_days(given_date,1)
或者你也可以使用 while True 和 break:
for i, row in dummy_dataframe.iterrows():
given_date = row['DATE']
while True:
try:
stock_price = get_stock_adj_close(row['TICKER'], given_date)
print(stock_price)
stock_prices.append(stock_price)
break
except KeyError:
given_date = add_days(given_date,1)
不要忘记确保您没有陷入无限循环,这对 while 循环的一些其他退出条件也有帮助,例如,在 10 次失败之后。