Files
MoFin/venv/lib/python3.12/site-packages/akshare/air/air_hebei.py
T
知微 fa45d8aa5f fix: 小果地址统一node122(兼容LAN+EasyTier)
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
  Privoxy对node122:18003返回500,直连正常
2026-06-30 02:56:35 +08:00

108 lines
5.3 KiB
Python

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/4/25 17:20
Desc: 河北省空气质量预报信息发布系统
https://110.249.223.67/publish
每日 17 时发布
等级划分
1. 空气污染指数为0-50,空气质量级别为一级,空气质量状况属于优。此时,空气质量令人满意,基本无空气污染,各类人群可正常活动。
2. 空气污染指数为51-100,空气质量级别为二级,空气质量状况属于良。此时空气质量可接受,但某些污染物可能对极少数异常敏感人群健康有较弱影响,建议极少数异常敏感人群应减少户外活动。
3. 空气污染指数为101-150,空气质量级别为三级,空气质量状况属于轻度污染。此时,易感人群症状有轻度加剧,健康人群出现刺激症状。建议儿童、老年人及心脏病、呼吸系统疾病患者应减少长时间、高强度的户外锻炼。
4. 空气污染指数为151-200,空气质量级别为四级,空气质量状况属于中度污染。此时,进一步加剧易感人群症状,可能对健康人群心脏、呼吸系统有影响,建议疾病患者避免长时间、高强度的户外锻练,一般人群适量减少户外运动。
5. 空气污染指数为201-300,空气质量级别为五级,空气质量状况属于重度污染。此时,心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状,建议儿童、老年人和心脏病、肺病患者应停留在室内,停止户外运动,一般人群减少户外运动。
6. 空气污染指数大于300,空气质量级别为六级,空气质量状况属于严重污染。此时,健康人群运动耐受力降低,有明显强烈症状,提前出现某些疾病,建议儿童、老年人和病人应当留在室内,避免体力消耗,一般人群应避免户外活动。
发布单位:河北省环境应急与重污染天气预警中心 技术支持:中国科学院大气物理研究所 中科三清科技有限公司
"""
import pandas as pd
import requests
from bs4 import BeautifulSoup
def air_quality_hebei() -> pd.DataFrame:
"""
河北省空气质量预报信息发布系统-空气质量预报, 未来 6 天
http://218.11.10.130:8080/#/application/home
:return: city = "", 返回所有地区的数据; city="唐山市", 返回唐山市的数据
:rtype: pandas.DataFrame
"""
url = "http://218.11.10.130:8080/api/hour/130000.xml"
r = requests.get(url)
soup = BeautifulSoup(r.content, features="xml")
data = []
cities = soup.find_all("City")
for city in cities:
pointers = city.find_all("Pointer")
for pointer in pointers:
row = {
"City": city.Name.text if city.Name else None,
"Region": pointer.Region.text if pointer.Region else None,
"Station": pointer.Name.text if pointer.Name else None,
"DateTime": pointer.DataTime.text if pointer.DataTime else None,
"AQI": pointer.AQI.text if pointer.AQI else None,
"Level": pointer.Level.text if pointer.Level else None,
"MaxPoll": pointer.MaxPoll.text if pointer.MaxPoll else None,
"Longitude": pointer.CLng.text if pointer.CLng else None,
"Latitude": pointer.CLat.text if pointer.CLat else None,
}
polls = pointer.find_all("Poll")
for poll in polls:
poll_name = poll.Name.text if poll.Name else None
poll_value = poll.Value.text if poll.Value else None
row[f"{poll_name}_Value"] = poll_value
row[f"{poll_name}_IAQI"] = poll.IAQI.text if poll.IAQI else None
data.append(row)
df = pd.DataFrame(data)
numeric_columns = ["AQI", "Longitude", "Latitude"] + [
col for col in df.columns if col.endswith("_Value") or col.endswith("_IAQI")
]
for col in numeric_columns:
df[col] = pd.to_numeric(df[col], errors="coerce")
column_names = {
"City": "城市",
"Region": "区域",
"Station": "监测点",
"DateTime": "时间",
"Level": "空气质量等级",
"MaxPoll": "首要污染物",
"Longitude": "经度",
"Latitude": "纬度",
"SO2_Value": "二氧化硫_浓度",
"SO2_IAQI": "二氧化硫_IAQI",
"CO_Value": "一氧化碳_浓度",
"CO_IAQI": "一氧化碳_IAQI",
"NO2_Value": "二氧化氮_浓度",
"NO2_IAQI": "二氧化氮_IAQI",
"O3-1H_Value": "臭氧1小时_浓度",
"O3-1H_IAQI": "臭氧1小时_IAQI",
"O3-8H_Value": "臭氧8小时_浓度",
"O3-8H_IAQI": "臭氧8小时_IAQI",
"PM2.5_Value": "PM2.5_浓度",
"PM2.5_IAQI": "PM2.5_IAQI",
"PM10_Value": "PM10_浓度",
"PM10_IAQI": "PM10_IAQI",
}
df = df.rename(columns=column_names)
basic_columns = [
"城市",
"区域",
"监测点",
"时间",
"AQI",
"空气质量等级",
"首要污染物",
"经度",
"纬度",
]
pollutant_columns = [col for col in df.columns if col not in basic_columns]
df = df[basic_columns + sorted(pollutant_columns)]
return df
if __name__ == "__main__":
air_quality_hebei_df = air_quality_hebei()
print(air_quality_hebei_df)