python - 使用 openweather API 将 json 加载到 pandas 数据框
问题描述
我正在尝试从 OpenWeatherMap 转换我的 json 数据,但它一直给我错误。当我在其他教程网站上尝试其他 json 文件时,它工作得非常好。
json格式:
{
"cod": "200",
"message": 0,
"cnt": 40,
"list": [
{
"dt": 1586250000,
"main": {
"temp": 303.36,
"feels_like": 306.76,
"temp_min": 303.36,
"temp_max": 303.95,
"pressure": 1006,
"sea_level": 1006,
"grnd_level": 1004,
"humidity": 61,
"temp_kf": -0.59
},
"weather": [{
"id": 500,
"main": "Rain",
"description": "light rain",
"icon": "10d"
}],
"clouds": {
"all": 97
},
"wind": {
"speed": 1.74,
"deg": 38
},
"rain": {
"3h": 0.29
},
"sys": {
"pod": "d"
},
"dt_txt": "2020-04-07 09:00:00"
}, {
"dt": 1586260800,
"main": {
"temp": 300.42,
"feels_like": 303.73,
"temp_min": 300.42,
"temp_max": 300.86,
"pressure": 1008,
"sea_level": 1008,
"grnd_level": 1006,
"humidity": 76,
"temp_kf": -0.44
},
"weather": [{
"id": 500,
"main": "Rain",
"description": "light rain",
"icon": "10n"
}],
"clouds": {
"all": 83
},
"wind": {
"speed": 2.5,
"deg": 52
},
"rain": {
"3h": 0.53
},
"sys": {
"pod": "n"
},
"dt_txt": "2020-04-07 12:00:00"
}, {
"dt": 1586271600,
"main": {
"temp": 299.85,
"feels_like": 303.12,
"temp_min": 299.85,
"temp_max": 300.15,
"pressure": 1010,
"sea_level": 1010,
"grnd_level": 1008,
"humidity": 80,
"temp_kf": -0.3
},
"weather": [{
"id": 500,
"main": "Rain",
"description": "light rain",
"icon": "10n"
}],
"clouds": {
"all": 62
},
"wind": {
"speed": 2.78,
"deg": 32
},
"rain": {
"3h": 0.16
},
"sys": {
"pod": "n"
},
"dt_txt": "2020-04-07 15:00:00"
}
],
"city": {
"id": 1880252,
"name": "Singapore",
"coord": {
"lat": 1.2897,
"lon": 103.8501
},
"country": "SG",
"population": 3547809,
"timezone": 28800,
"sunrise": 1586214152,
"sunset": 1586257828
}
}
我用 python 创建了一个函数来读取带有 api 调用的 JSON 并使用 pandas 将其转换为数据帧
def _weather():
url = 'http://api.openweathermap.org/data/2.5/forecast?q=Singapore,{API}'
res = requests.get(url)
data = res.json()
return data
将其读取为 json 后,我尝试将其转换为数据帧,但收到错误
#df = pd.dataFrame(_weather)
df = pd.read_json(_weather)
我错过了什么步骤吗?
预期的数据框如图所示,我正在尝试显示 16 行数据,因为我正在提取 16 天/每日预测的数据。
解决方案
试试这个,了解更多关于 json_normalize,
def _weather_pd(url):
df1 = json_normalize(url['list'], 'weather')
df2 = json_normalize(url['list'])
df = df2.drop('weather', axis=1).join(df1)
return df
推荐阅读
- flutter - Flutter:如何在一行内设置可变长度字符串?
- blazor - 如何强制对 Blazor Web 程序集使用 https?
- php - 包含 IN 和 LIKE 运算符作为抽象函数
- java - 从 InputStream(ByteArrayInputStream) 对象中获取绝对文件路径
- c# - 如何在泛型类中设置泛型类型
- c# - C# 的无效强制转换异常
- wpf - WPF:DataGridTemplateColumn 内的网格未扩展
- dc.js - 如何动态更改条形图中的 bin 大小(dc.js)?
- javascript - 网页上的 HTML 元素显示错误
- ios - RealmSwift:即使我们从正在运行的应用程序的磁盘存储中删除 .realm 文件,也能够执行 CRUD 操作