首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中将几个表示为嵌套字典的“响应”对象转换为多维列表

在python中将几个表示为嵌套字典的“响应”对象转换为多维列表
EN

Stack Overflow用户
提问于 2018-07-08 12:51:43
回答 1查看 72关注 0票数 1

编辑:我似乎不知道如何正确地遍历这个对象。我认为我错误地索引了内容,因为错误指出空白文本与我的日期时间转换格式不匹配。

下面是一个响应对象的开头,它很长,所以我选择不包含整个内容。然而,在任何时候都没有异常,并继续遵循最初的模式。请帮助我了解如何获得访问权限,并仅迭代日期和那里的继续信息。

代码语言:javascript
复制
{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’不匹配

现在我尝试的更新了代码

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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变量(为了简单起见)是“邪恶的”,最好尽可能避免(事实证明,这几乎总是如此),或者除非你有一个非常好的理由使用它们(坦率地说,你很少有这样的理由)。它们打破了对作用域的普遍理解,最终可能成为人们在访问它们时没有预料到的东西。案例切中要害。如果您已经完成了symboliterate_data(),并在下一次调用时再次调用它。下一次传递的初始值将是它在上一次go中的最后一个值。

上面的信息应该可以解决你目前看到的问题,并让你遇到下一个问题。这就是这一行:

代码语言:javascript
复制
     for key in p_date:
        this_list[list_size] = p_date[key]

这里的key是来自pdate的字符(例如,第一次迭代时的"2" )。它不是p_date ( str)的有效索引。不幸的是,我真的不确定结果列表(或一般的输出)应该是什么样子,因此我只能为下一步提供有限的输入。我的意思是:

代码语言:javascript
复制
    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中的一件事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51228936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档