使用Python/Pandas库解析JSON响应数据出现问题

3

我正在从一个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 示例吗? - jezrael
你手头的不是JSON,而是Python(2)字典的表示。任何JSON解析器都无法处理它。 - Klaus D.
我认为这不是JSON,而是print(result) - jezrael
2个回答

1
我认为你可以使用DataFrame构造函数
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_csv,可以省略with open
result.to_csv("Historical.csv", date_format='%d/%m/%Y', header = None)

太好了,感谢您的帮助,这正是我所需要的。我没有意识到 Pandas 已经将其读入 Python 字典中。将其放入数据框中解决了问题,现在我可以按照要求转换数据了。 - C. Thompson

0

太厉害了!!

我卡在这里了,没意识到我实际上是在打印Python字典而不是原始JSON。

jezrael - 你创建新数据框的答案很好用,还感谢你使用drop和omit。现在看起来好多了。

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

谢谢 - 问题解决了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接