【问题标题】:Find specific Value in json api call在 json api 调用中查找特定值
【发布时间】:2017-12-19 18:04:20
【问题描述】:

即使 API 上的日期不断变化,我能否找到这只股票的 close 价格?

API:

'Time Series (1min)': {  
     '2017-12-19 13:01:00':{  
           '1. open':'196.4100',
           '2. high':'196.5075',
           '3. low':'196.3800',
           '4. close':'196.3800',
           '5. volume':'4961'
            }
}

Python 代码:

print('Grabbing stock price...')
ourl = req.get(url)
im = ourl.json()
return im #return closing price

【问题讨论】:

  • 我只需要知道如何组织字符串来获取收盘价,例如:im['Time Series (1min)'][0]['4.关闭']

标签: python json python-3.x api


【解决方案1】:

在您自己的示例中几乎已经完成,只需将 0 替换为实际日期即可。

im['Time Series (1min)']['2017-12-19 13:01:00']['4. close']
# output '196.3800'

为循环编辑:

dict 的问题是,您没有为dict 编制索引,而是使用键访问项目。这是拥有键值对的主要目的。 或者更准确地说,当你需要索引某些东西时不要使用dict

我建议你使用 pandas 之类的东西。

import pandas as pd

# option 1
df = pd.DataFrame(ourl.json())
df.columns = ['Meta', 'TS']  # save time typing spaces
return df.TS[2]['4. close']

# option 2
df = pd.DataFrame(ourl.json())
return df.iloc[:, 1][2]['4. close']

# output 
  '196.3800'

通过这种方式,您可以在每次获取项目时返回单个值,并通过索引仅返回该值。(部分)

附:你没有告诉我们ourl.json() 返回什么,我假设它在这里返回字典。特别是,您想要做的是正确索引,组织字符串对我来说有点令人困惑..因为我们实际上并没有组织字符串:)

【讨论】:

  • 这可行,但['2017-12-19 13:01:00'] 会不断变化,因此我必须使用索引,因为此 API 返回多个日期,我想要最近的日期
  • 这仍然不起作用,给我和错误:ValueError: Length mismatch: Expected axis has 2 elements, new values have 1 elements
  • 这意味着你的 json 这次返回了不同的东西,你能检查一下吗?对于您在上面作为结果返回发布的内容,只要结构不变,它肯定可以工作
  • 我的 api 调用返回的正是这个(记住我想得到最近一次的收盘价):pastebin.com/7c3LX37Z
  • 我在代理后面,看不到文件共享抱歉...如果您不介意可以将其添加到您的问题中,这样我现在可以看一下,否则让我回家第一个:)
【解决方案2】:

在不知道时间的情况下提取价格的另一种方法是将urllib.request 包与json 包一起使用并进行一些循环:

import json
import urllib.request

def extract_json(f):
    json_decode = json.load(f)
    time_series = json_decode['Time Series (1min)']
    for data in time_series:
        print(time_series[data]['3. low'])

opener = urllib.request.FancyURLopener({})
url = "http://localhost:8092/sample_json.json"
f = opener.open(url)
extract_json(f)

如果服务器上的输入是:

{
  "Time Series (1min)": {
    "2017-12-19 13:01:00": {
      "1. open": "196.4100",
      "2. high": "196.5075",
      "3. low": "196.3800",
      "4. close": "196.3800",
      "5. volume": "4961"
    }
  }
}

运行脚本的结果是:

196.3800

在这个版本上试过:

3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)]

【讨论】:

    【解决方案3】:

    使用im.items() 将您的字典转换为元组。然后使用索引来访问元素。

    im = {
        'Time Series (1min)': {
            '2017-12-19 13:01:00': {
                '1. open': '196.4100',
                '2. high': '196.5075',
                '3. low': '196.3800',
                '4. close': '196.3800',
                '5. volume': '4961'
            }
        }
    }
    

    对于 Python 2

    print im['Time Series (1min)'].items()[0][1]['4. close'] # prints 196.3800
    

    对于Python 3,这应该改变如下

    print(list(a['Time Series (1min)'].items())[0][1]['4. close']) # prints 196.3800
    

    或者你可以循环遍历a['Time Series (1min)'].items()iterable

    【讨论】:

    • 每当我尝试在 [0] 处对其进行索引时,我都会收到此错误:
    • Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> grabstock('NVDA') File "C:\Users\bobby\Desktop\Code\Python\bitcoin bot.py", line 24, in grabstock return tuple1[0] TypeError: 'dict_items' object does not support indexing
    • def grabstock(symbol): print('Grabbing stock price...') url = 'https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol='+str(symbol)+'&interval=1min&apikey=HMAI6PZDJ8JYLF5W' ourl = req.get(url) im = ourl.json() return im['Time Series (1min)'].items()[0][1]['4. close']
    • 抱歉格式错误,堆栈溢出不喜欢空格或制表符
    • 错了; dict.items() 给你一个dict_items 对象,它没有给你tuple
    猜你喜欢
    • 2017-07-03
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2021-11-19
    • 2017-03-04
    • 2012-12-12
    • 2012-09-04
    相关资源
    最近更新 更多