【问题标题】:Continuing during an exception in a try/except statement在 try/except 语句中的异常期间继续
【发布时间】: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


    【解决方案1】:

    我认为 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 Truebreak一起使用:

    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 次失败之后。

    【讨论】:

    • 它回答了你的问题吗?
    • 好的,非常感谢!我会支持你,但我不能以我目前的水平,对不起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多