编辑:我似乎不知道如何正确地遍历这个对象。我认为我错误地索引了内容,因为错误指出空白文本与我的日期时间转换格式不匹配。
下面是一个响应对象的开头,它很长,所以我选择不包含整个内容。然而,在任何时候都没有异常,并继续遵循最初的模式。请帮助我了解如何获得访问权限,并仅迭代日期和那里的继续信息。
{u'Meta Data': {u'1. Information': u'Daily Prices (open, high, low, close) and Volumes',
u'2. Symbol': u'MSFT',
u'3. Last Refreshed': u'2018-07-06',
u'4. Output Size': u'Compact',
u'5. Time Zone': u'US/Eastern'},
u'Time Series (Daily)': {u'2018-02-13': {u'1. open': u'88.9300',
u'2. high': u'90.0000',
u'3. low': u'87.8000',
u'4. close': u'89.8300',
u'5. volume': u'26200053'},
u'2018-02-14': {u'1. open': u'88.5100',
u'2. high': u'90.9900',
u'3. low': u'88.4100',
u'4. close': u'90.8100',
u'5. volume': u'34314101'},
u'2018-02-15': {u'1. open': u'91.2100',
u'2. high': u'92.7200',
u'3. low': u'90.6200',
u'4. close': u'92.6600',
u'5. volume': u'27407914'},
我收到这个错误,表明我正在错误地解析dict
,我已经尝试了很多方法,但似乎无法获得它。我相信这是让这个程序运行的最后一个驼峰。(最后)
ValueError:时间数据'‘与格式'%Y-%b-%d’不匹配
现在我尝试的更新了代码
import requests
import json
# Global Variables
url = "https://www.alphavantage.co/query"
function_type = "TIME_SERIES_DAILY"
api_key = "***********"
current_zero_time = ""
main_list = []
symbols = ["AAPL", "HPQ", "IBM", "AMZN", "MSFT", "GOOGL", "INTC", "CSCO", "ORCL", "OCOM"]
def get_data(symbol):
global api_key
global function_type
request_data = {"function": function_type,
"symbol": symbol,
"apikey": api_key}
data_dict = requests.get(url, params=request_data)
return data_dict
def date_dif(date0, date1):
from datetime import datetime
d0_obj = datetime.strptime(date0, '%Y-%b-%d')
d1_obj = datetime.strptime(date1, '%Y-%b-&d')
return (d1_obj - d0_obj).days
def iterate_data(symbol):
data_set = get_data(symbol)
data_set = json.loads(data_set.text)
global current_zero_time
list_size = 0
this_list = [list_size + 1]
for p_date in data_set['Time Series (Daily)']:
if current_zero_time is None:
current_zero_time = p_date
this_list[list_size] = 0
else:
t = date_dif(current_zero_time, p_date)
this_list[list_size] = t
list_size += list_size
for key in p_date:
this_list[list_size] = p_date[key]
list_size += list_size
return this_list
def make_list(stocks):
global main_list
for i in range(len(stocks)):
this_list = iterate_data(symbols[i])
main_list = main_list + this_list
make_list(symbols)
print(main_list)
发布于 2018-07-11 03:20:29
这对于评论来说有点太多了。请记住,为了将来的读者,我们应该注意制作一个有用的问题/答案对。也许当合理的时候(现在?),我们结束对代码和相应问题的迭代,并开始一个新的迭代。
到目前为止,我们已经介绍了requests.get()
返回Response
对象。要获得请求读取的内容,我们需要访问它的text
属性。如果该文本是JSON表示,则可以使用json.loads()
进行解析。
现在,对于当前出现的问题,您已经将变量current_zero_time
定义为""
,但是第一次调用iterate_data()
会将条件中的current_zero_time is None
求值为False
(事实并非如此)。也许你想说if not current_zero_time: ...
?因此,您和up调用date_dif()
的第一个参数是""
(空字符串),strptime
无法将其解析为时间(->ValueError
)。
说到strptime
。该格式字符串似乎与您的(ISO格式)日期不匹配。应该是"%Y-%m-%d"
(将b
:month name替换为m
:month number)。第二行也有一个拼写错误的&d
,而它应该是%d
。你会遇到这些问题,分别是第三和第四个问题。
附注:global
变量(为了简单起见)是“邪恶的”,最好尽可能避免(事实证明,这几乎总是如此),或者除非你有一个非常好的理由使用它们(坦率地说,你很少有这样的理由)。它们打破了对作用域的普遍理解,最终可能成为人们在访问它们时没有预料到的东西。案例切中要害。如果您已经完成了symbol
的iterate_data()
,并在下一次调用时再次调用它。下一次传递的初始值将是它在上一次go中的最后一个值。
上面的信息应该可以解决你目前看到的问题,并让你遇到下一个问题。这就是这一行:
for key in p_date:
this_list[list_size] = p_date[key]
这里的key
是来自pdate
的字符(例如,第一次迭代时的"2"
)。它不是p_date
( str
)的有效索引。不幸的是,我真的不确定结果列表(或一般的输出)应该是什么样子,因此我只能为下一步提供有限的输入。我的意思是:
for key in p_date:
this_list[list_size] = key
例如,迭代p_date
中的字符并将它们作为值分配给this_list[list_size]
;同时更改None
/ ""
不匹配并修复成对的strptime
问题。你可以让脚本无故障地完成执行...但如上所述,可能仍然没有做它想要做的事情。
无论如何,至少有几个有希望的有用的提示我可以提供。为了更好地理解当出现异常(如您的问题中的ValueError
)时您的脚本处于什么状态,或者只是为了四处看看。您可以在调试器中运行它。使用python -m pdb ./script.py
而不是调用脚本python ./script.py
(或仅调用./script.py
)。你可以运行你的程序,遍历它,检查堆栈框架,在给定的时间变量的值…键入help
可获得基本帮助,键入help COMNAND
可获取有关命令的更多信息。
第二个提示是(在global
变量之上)关于样式。所有的导入通常都在脚本/模块的顶部处理。事实上,PEP-8中有样式建议,并且有像pylint这样的有用工具来检查您的代码。我提到这一点,因为一些错误和混乱几乎可以神奇地消失,只要稍微清理一下。:)
对你的问题的一个侧面注释/澄清:它被标记为python-3.x,但在你的判断书中的字符串文字可能会有不同的建议。u''
文字是Python2中的一件事。
https://stackoverflow.com/questions/51228936
复制相似问题