【问题标题】:Python TypeError: unhashable type: 'dict'Python TypeError:不可散列的类型:'dict'
【发布时间】:2018-03-13 13:05:19
【问题描述】:

我正在尝试使用 API 请求来收集天气数据,并最终将数据保存到带有 pandas.to_csv 的 CSV 文件中。 API 请求正在运行,但是当我尝试将 API 响应从字典转换为 pandas 时出现此错误。非常感谢任何关于我做错的提示:

TypeError: unhashable type: 'dict'

代码的最后一行搞砸了,shell返回错误:

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

api_key = ""
date = "20170601"
zip_code = "53711"

response = urlopen("http://api.wunderground.com/api/%s/history_%s/q/%s.json"     % (api_key, date, zip_code))

json_data = response.read().decode('utf-8', 'replace')

data = json.loads(json_data)

for observation in data['history']['observations']:
     print("Date/Time:    " + observation['date']['pretty'])
     print("Temperature:  " + observation['tempi'])
     print("Humidity:     " + observation['hum'])

df = pd.DataFrame([data], columns=data.keys())

屏幕截图是数据在 shell 输出中的样子:

【问题讨论】:

  • 如果没有json 的样本,回答就不是那么容易了,但json_normalize 应该可以。
  • 如何获取 json 样本?是否可以仅打开具有正确 URL 的 Web 浏览器来显示 json?还是 Chrome 开发者模式下的东西???
  • 没有api_key ?
  • 我会将json_normalize 粘贴在代码中的什么位置?谢谢
  • API 密钥是免费的,我想每天最多只能调用 50 次,人们通常会发布这些内容吗?如果没什么大不了的,我会的,哈哈

标签: python-3.x api pandas data-science


【解决方案1】:

您可以将json_normalize 与过滤列一起使用,也可以转换日期列to_datetime

from pandas.io.json import json_normalize

df = json_normalize(data['history']['observations'])

df = df[['date.pretty','tempi','hum']]
df['date.pretty'] = pd.to_datetime(df['date.pretty'])
print (df.head())
          date.pretty tempi hum
0 2017-06-01 00:15:00  49.8  83
1 2017-06-01 00:35:00  50.0  82
2 2017-06-01 00:55:00  49.1  85
3 2017-06-01 01:15:00  49.3  83
4 2017-06-01 01:35:00  48.2  85

【讨论】:

  • 我插入了上面的代码,并在我的初始代码中替换了它:
  • df = pd.DataFrame([data], columns=data.keys())
  • 但我收到一个错误,“NameError: name 'json_normalize' is not defined”
  • 我添加导入回答。我认为现在它工作得很好。
  • 哇,感谢几百万完成这项工作。让我知道是否需要检查更多框以说明该帖子是否有用。我不知道我需要点击绿色复选框,祝你有美好的一天!
猜你喜欢
  • 2012-10-27
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
相关资源
最近更新 更多