使用 Python/Pandas 库无法解析来自 JSON 响应的数据

Posted

技术标签:

【中文标题】使用 Python/Pandas 库无法解析来自 JSON 响应的数据【英文标题】:Trouble Parsing data from JSON response with Python/Pandas Library 【发布时间】:2016-07-24 22:18:01 【问题描述】:

我正在读取来自 Web API 的 JSON 响应,它返回时间序列货币数据,我需要能够仅隔离货币,然后对它们执行平均计算。

API 返回:

                                          rates
2016-03-01  u'USD': 0.66342297, u'AUD': 0.92449052
2016-03-02  u'USD': 0.66676313, u'AUD': 0.91501037
2016-03-03    u'USD': 0.67240633, u'AUD': 0.914753
2016-03-04  u'USD': 0.68185522, u'AUD': 0.91650478
2016-03-05  u'USD': 0.68185522, u'AUD': 0.91650478
2016-03-06  u'USD': 0.68073566, u'AUD': 0.91793187
2016-03-07   u'USD': 0.6794346, u'AUD': 0.90979962
2016-03-08  u'USD': 0.67392847, u'AUD': 0.90683613
2016-03-09  u'USD': 0.66438164, u'AUD': 0.88859516
2016-03-10     u'USD': 0.66666, u'AUD': 0.89461305
2016-03-11  u'USD': 0.67452488, u'AUD': 0.89174887
2016-03-12  u'USD': 0.67452488, u'AUD': 0.89174887
2016-03-13  u'USD': 0.67358755, u'AUD': 0.89251092
2016-03-14   u'USD': 0.6667529, u'AUD': 0.88783949
2016-03-15  u'USD': 0.66084856, u'AUD': 0.88557738
2016-03-16  u'USD': 0.67423336, u'AUD': 0.89318458
2016-03-17  u'USD': 0.68315297, u'AUD': 0.89391181
2016-03-18  u'USD': 0.67954772, u'AUD': 0.89359166
2016-03-19  u'USD': 0.67983322, u'AUD': 0.89388959
2016-03-20  u'USD': 0.67951586, u'AUD': 0.89439032
2016-03-21    u'USD': 0.67690921, u'AUD': 0.892827
2016-03-22  u'USD': 0.67500204, u'AUD': 0.88599621
2016-03-23  u'USD': 0.67137479, u'AUD': 0.89131852
2016-03-24  u'USD': 0.66980223, u'AUD': 0.89002584
2016-03-25   u'USD': 0.6686168, u'AUD': 0.89045449
2016-03-26   u'USD': 0.6686168, u'AUD': 0.89045449
2016-03-27   u'USD': 0.66853276, u'AUD': 0.8903994
2016-03-28  u'USD': 0.67270532, u'AUD': 0.89168637
2016-03-29  u'USD': 0.68576241, u'AUD': 0.89832338
2016-03-30  u'USD': 0.69112465, u'AUD': 0.90136407
2016-03-31  u'USD': 0.69193139, u'AUD': 0.90265425

Python 代码:

urlread = url + api_id  + '&start=' + startdate + '&end=' + enddate +           '&base=' + base + '&symbols=' + symbols + '&prettyprint=false'
   print(urlread)
   #Reads in response from URL
   result = pd.read_json(urlread, orient="records")
   #Removes Columns not required
   del result['base']
   del result['license']
   del result['disclaimer']
   del result['start_date']
   del result['end_date']
   #del json['rates']
   #Prints output of JSON to screen for troubleshooting, can be commented out
  print(result)
  #Writes JSON output to CSV file and formats Date and Removes Headers
  with open("Historical.csv", "w") as output:
      result.to_csv(output, date_format='%d/%m/%Y', header = None)

CSV 输出:

1/03/2016   u'USD': 0.6634229700000001, u'AUD': 0.92449052
2/03/2016   u'USD': 0.66676313, u'AUD': 0.9150103700000001
3/03/2016   u'USD': 0.67240633, u'AUD': 0.9147529999999999
4/03/2016   u'USD': 0.68185522, u'AUD': 0.91650478
5/03/2016   u'USD': 0.68185522, u'AUD': 0.91650478
6/03/2016   u'USD': 0.68073566, u'AUD': 0.91793187
7/03/2016   u'USD': 0.6794346, u'AUD': 0.90979962
8/03/2016   u'USD': 0.67392847, u'AUD': 0.9068361300000001
9/03/2016   u'USD': 0.66438164, u'AUD': 0.88859516
10/03/2016  u'USD': 0.66666, u'AUD': 0.89461305

所以它只是转储输出,我似乎无法解析它以删除 JSON 格式。实际上,在转储到 csv 之前,我需要对所有货币进行平均。我怎样才能做到这一点?

【问题讨论】:

你能添加json的有效样本吗? 你所拥有的没有 JSON,它是 Python (2) 字典的表示。任何 JSON 解析器都会失败。 我觉得不是json,而是print(result) 【参考方案1】:

天才!!,

这就是我所坚持的,没有意识到我实际上是在打印 Python Dict 而不是原始 JSON。

jezrael - 您创建新 Dataframe 的答案有效,也感谢使用 drop 和 omit 和 open 的提示。现在看起来好多了。

我现在已经能够获得每列的平均值,并构建一个新的数据框,该数据框以我需要的格式输出到 csv。

谢谢你 - 问题解决了!

【讨论】:

【参考方案2】:

我觉得你可以用DataFrame constructor:

print result
                                               rates
2016-03-01  u'USD': 0.66342297, u'AUD': 0.92449052

result = pd.DataFrame([x for x in result.rates], index=result.index)
print result
                 AUD       USD
2016-03-01  0.924491  0.663423

你可以用drop代替del

result = result.drop(['base','license','disclaimer','start_date','end_date'], axis=1)

如果要写to_csvwith open可以省略:

result.to_csv("Historical.csv", date_format='%d/%m/%Y', header = None)

【讨论】:

完美,感谢您的帮助,这正是我所需要的。我没有意识到 Pandas 已经将它读入 python 字典。将它放入数据框解决了这个问题,我现在可以根据需要转换数据

以上是关于使用 Python/Pandas 库无法解析来自 JSON 响应的数据的主要内容,如果未能解决你的问题,请参考以下文章

python pandas怎么用

Python Pandas——Read_csv详解

Python Pandas 条件无法准确识别行

使用 Python/Pandas 解析嵌套的 JSON

无法将 git 存储库解析为 android gradle 中的依赖项

Python Pandas库教程(超详细)