Pandas.read_json(JSON_URL)

Posted

技术标签:

【中文标题】Pandas.read_json(JSON_URL)【英文标题】: 【发布时间】:2018-03-16 15:07:41 【问题描述】:

我正在使用 Pandas 从 API 获取数据。 API 以 JSON 格式返回数据。但是,json 有一些我不希望在数据框中出现的值。由于这些值,我无法为数据框分配索引。以下是格式。


"Success": true,
"message": "",
"result": ["id":12312312, "TimeStamp":"2017-10-04T17:39:53.92","Quantity":3.03046306,,"id": 2342344, "TimeStamp":"2017-10-04T17:39:53.92","Quantity":3.03046306,]

我只对“结果”部分感兴趣。 一种方法是使用request.get(request_URL) 导入json,然后在提取“结果”部分后,将结果转换为数据帧。 第二种方法是使用 导入数据,将返回的数据帧转换回json,然后提取“结果”部分后,将结果转换为数据帧。

还有其他方法可以做到这一点吗?什么是最好的方法,为什么?谢谢。

【问题讨论】:

【参考方案1】:

使用json_normalize:

import pandas as pd

df = pd.json_normalize(json['result'])
print (df)

   Quantity               TimeStamp        id
0  3.030463  2017-10-04T17:39:53.92  12312312
1  3.030463  2017-10-04T17:39:53.92   2342344

也在这里工作:

df = pd.DataFrame(d['result'])
print (df)
   Quantity               TimeStamp        id
0  3.030463  2017-10-04T17:39:53.92  12312312
1  3.030463  2017-10-04T17:39:53.92   2342344

对于DatetimeIndex 转换列to_datetimeset_index

df['TimeStamp'] = pd.to_datetime(df['TimeStamp'])
df = df.set_index('TimeStamp')
print (df)

                         Quantity        id
TimeStamp                                  
2017-10-04 17:39:53.920  3.030463  12312312
2017-10-04 17:39:53.920  3.030463   2342344

编辑:

负载数据解决方案:

from urllib.request import urlopen
import json
import pandas as pd

response = urlopen("https://bittrex.com/api/v1.1/public/getmarkethistory?market=BTC-ETC")
json_data = response.read().decode('utf-8', 'replace')

d = json.loads(json_data)
df = pd.json_normalize(d['result'])
df['TimeStamp'] = pd.to_datetime(df['TimeStamp'])
df = df.set_index('TimeStamp')

print (df.head())
                          Quantity     Total  
TimeStamp                                     
2017-10-05 06:05:06.510   3.579201  0.010000  
2017-10-05 06:04:34.060  45.614760  0.127444  
2017-10-05 06:04:34.060   5.649898  0.015785  
2017-10-05 06:04:34.060   1.769847  0.004945  
2017-10-05 06:02:25.063   0.250000  0.000698  

另一种解决方案:

df = pd.read_json('https://bittrex.com/api/v1.1/public/getmarkethistory?market=BTC-ETC')
df = pd.DataFrame(df['result'].values.tolist())
df['TimeStamp'] = pd.to_datetime(df['TimeStamp'])
df = df.set_index('TimeStamp')
print (df.head())

                          Quantity     Total  
TimeStamp                                     
2017-10-05 06:11:25.100   5.620957  0.015704  
2017-10-05 06:11:11.427  22.853546  0.063851  
2017-10-05 06:10:30.600   6.999213  0.019555  
2017-10-05 06:10:29.163  20.000000  0.055878  
2017-10-05 06:10:29.163   0.806039  0.002252  

【讨论】:

谢谢@jezrael,我怎样才能让 TimeStamp 成为索引。 所以发生了一些奇怪的事情,我正在使用 pd.DataFrame(d['result']) 获取数据框,但它只返回一个名为“result”的列。 bittrex.com/api/v1.1/public/getmarkethistory?market=BTC-ETC 是数据的来源。感谢您的帮助。 我觉得第一种方案比较通用,最好用一下。 df = json_normalize(json['result']) 我添加了 2 个可能的解决方案,请检查编辑后的答案。【参考方案2】:

另一种解决方案,基于 jezrael 的使用请求:

import requests
import pandas as pd

d = requests.get("https://bittrex.com/api/v1.1/public/getmarkethistory?market=BTC-ETC").json()
df = pd.DataFrame.from_dict(d['result'])
df['TimeStamp'] = pd.to_datetime(df['TimeStamp'])
df = df.set_index('TimeStamp')

df

【讨论】:

如果“get”请求中的json数据太大怎么办,处理起来很容易。还是有其他更好的方法?

以上是关于Pandas.read_json(JSON_URL)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ```pandas.read_json(...)` 期间修复 ```ValueError: Trailing data```?

使用 pandas.read_json 时出现 ValueError

在 Pandas UnicodeDecodeError 中无法使用 pandas.read_json() 解码 JSON 文件中的 Unicode Ascii

如何让 pandas.read_json 将此 API 返回识别为有效的 .json?

Pandas Series 写入和读取 json 数据会产生带有 to_json 和 read_json 的 ValueError [重复]

如何使用 pandas read_json 读取 ADSB json 数据? [复制]