如何正确解析REST接口数据并生成Pandas DataFrame(美国干旱监测案例)
从美国干旱监测REST接口获取数据并转为Pandas DataFrame
我需要通过REST服务获取美国干旱监测(U.S. Drought Monitor)数据,示例请求URL如下:
url = "https://usdmdataservices.unl.edu/api/HUCStatistics/GetDroughtSeverityStatisticsByArea?aoi=10190016&startdate=1/1/2022&enddate=12/31/2022&statisticsType=2"
我想把返回的数据读取到Python中并生成指定结构的Pandas DataFrame,但目前用Beautiful Soup解析后得到了一段长字符串,显然操作有误,现有代码如下:
from bs4 import BeautifulSoup import requests page = requests.get(url) soup = BeautifulSoup(page.text, 'html.parser') text = soup.get_text()[2:-2]
期望得到的DataFrame结构如下:
| index | HUCId | MapDate | HUC | HUCLevel | None | D0 | D1 | D2 | D3 | D4 | ValidStart | ValidEnd | StatisticFormatID |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 10190016 | 20221227 | Lower Lodgepole | 8 | 0.00 | 0.00 | 0.00 | 0.00 | 1,334.13 | 0.00 | 2022-12-27 | 2023-01-02 | 2 |
正确处理方式
这个REST接口返回的是JSON格式数据,不需要用Beautiful Soup(用于解析HTML/XML),直接读取JSON并转换为DataFrame即可:
- 导入所需库:
import requests import pandas as pd
- 发送请求并解析JSON:
url = "https://usdmdataservices.unl.edu/api/HUCStatistics/GetDroughtSeverityStatisticsByArea?aoi=10190016&startdate=1/1/2022&enddate=12/31/2022&statisticsType=2" # 发送GET请求并获取JSON响应 response = requests.get(url) data = response.json() # 转换为DataFrame df = pd.DataFrame(data)
- 可选:处理数值格式(比如D3列的千分位逗号):
如果需要将带千分位的字符串转为数值类型,可以用以下代码:
# 遍历干旱等级列,去除逗号并转为浮点型 drought_cols = ['None', 'D0', 'D1', 'D2', 'D3', 'D4'] for col in drought_cols: df[col] = df[col].str.replace(',', '').astype(float)
最终效果
执行上述代码后,df就会生成你期望的DataFrame结构,包含所有指定列和对应数据。
内容的提问来源于stack exchange,提问作者hydrodog
相关产品推荐
相关产品推荐

