PM2.5 对人体的健康影响很大,所以空气中的 PM2.5
实时信息受到越来越多的关注。
Python 的 Pandas 套件不但可以自动读取网页中的表格
数据 , 还可对数据进行修改、排序等处理,也可绘制统计
图表,对于信息抓取、整理以及显示是不可多得的好工具。
将开发一个 PM2.5 实时监测显示器程序 。 本程序
可以直接读取行指定网站上的 PM2.5 数据,并在整理后显
示,这样就可以方便地让用户随时看到最新的 PM2.5 监测
数据。
应用程序总览
执行程序后,会自动选取第 1 条数据的区县及监测站点,下方则显示该监测站
点当前 P阳5 数值及污染等级。某些监测站点也可能没有监测数据,若无数据,程
序会在信息框中告知用户。

单击其他区县,下方监测站点会显示该区县所有监测站点,默认选取第 l 个监
测站点井显示其 PM2.5 信息。单击其他监测站点,则显示其他站点的 PM2.5 信息。

用户还可以随时单击“更新数据”按钮来刷新该监测站的最新 PM2.5 数据 。

PM2.5 公开数据
我们要抓取北京市各区县的 PM2.5 数据在网站 http://www.86pm25.com/city/
beijing.html 中 。打开网页,我们可以看到一个北京市各区县的“各监测站点实时数据”
表格,在网页的最下方,可以选取不同的城市。

以上数据位于网页的一个 table 中 。
使用 Pandas 的 read html 方法可导入网页中的表格数据,程序代码为 : 
import pandas as pd

dt = pd.read_html("http://www.86pm25.com/city/beijing.html")
data=dt[0]
print(data)

用户数据接口配置
本应用程序使用 Tkinter 套件设计用户数据接口 :
import tkinter as tk
import pandas as pd df = pd.read_html("http://www.86pm25.com/city/beijing.html")
data=df[0]
win=tk.Tk()
win.geometry("640x270")
win.title("PM2.5 实时监测")
city = tk.StringVar() #区县名称变量
site = tk.StringVar() #监测站点名称变量
result1 = tk.StringVar() #显示信息变量
citylist = [] #区县列表
sitelist = [] #监测站点列表
listradio = [] #区县按钮列表
#建立区县列表
for c1 in data["区╱县"]:
if(c1 not in citylist): #如果列表中不存在该县区就将该县区名称插入列表
citylist.append(c1)
#建立第1个区县的监测站点列表
count = 0
for c1 in data["区╱县"]:
if(c1 == citylist[0]): #如果是第1个区县,则
sitelist.append(data.ix[count, 1]) #把该区县的所有监测站点插入到监测站点列表
count += 1
label1 = tk.Label(win, text="区县:", pady=6, fg="blue", font=("新细明体", 12))
label1.pack()
frame1 = tk.Frame(win) #区县容器
frame1.pack()
for i in range(0,2): #按钮分2行
for j in range(0,8): #每行8个
n = i * 8 + j #第n个按钮
if(n < len(citylist)):
city1 = citylist[n] #取得区县名称
rbtem = tk.Radiobutton(frame1, text=city1, variable=city, value=city1, command=rbCity) #建立单选按钮
rbtem.grid(row=i, column=j) #设置按钮的位置
if(n==0): #选取第1个区县
rbtem.select()
label2 = tk.Label(win, text="监测站点:", pady=6, fg="blue", font=("新细明体", 12))
label2.pack()
frame2 = tk.Frame(win) #监测站点容器
frame2.pack()
sitemake()
btnDown = tk.Button(win, text="更新数据", font=("新细明体", 12), command=clickRefresh)
btnDown.pack(pady=6)
lblResult1 = tk.Label(win, textvariable=result1, fg="red", font=("新细明体", 16))
lblResult1.pack(pady=6)
rbSite() #显示测站讯息
win.mainloop()
事件处理及函数
用户单击区县按钮后的处理函数:读取单击区县对应的监测站点,并重构监测
站点按钮,然后显示第 1 个监测站点的 PM2.5 信息 。
def rbCity():  #单击区县按钮的处理函数
global sitelist, listradio
sitelist.clear() #清除原有监测站点列表
for r in listradio: #删除原有监测站点按钮
r.destroy()
n=0
for c1 in data["区╱县"]: #逐一取出所选区县市的监测站点
if(c1 == city.get()):
sitelist.append(data.ix[n, 1])
n += 1
sitemake() #生成测站点按钮
rbSite() #显示PM2.5数值
用户单击监测站点按钮后的处理函数 : 显示单击的监测站点的 PM2.5 信息。
def rbSite():  #单击监测站按钮后的处理函数
n = 0
for s in data.ix[:,1]: #逐一取得监测站点
if(s == site.get()): #如果某监测站点名称与选中的监测站点相同,则
pm = data.ix[n][ "PM2.5浓度"] #取得该站点的PM2.5数值
pm=pm[:-5] #去除数据后面的5位单位字符
pm=int(pm) #把PM2.5的字符型数据转为整型
if(pd.isnull(pm)): #如果没有数据,则
result1.set(s + "站的 PM2.5 值当前无数据!") #显示无数据
else: #如果有数据,则
if(pm <= 35): #转换为空气质量等级
grade1 = "优秀"
elif(pm <= 53):
grade1 = "良好"
elif(pm <= 70):
grade1 = "中等"
else:
grade1 = "差"
result1.set(s + "站的 PM2.5 值为" + str(pm) + ";" + grade1 )
break #找到选中的监测站点的数据后就跳出循环
n += 1
cli ckRefresh 为用户单击 “更新数据”按钮后 的处理函数 : 重新读取网 页数据后
更新监测站点数据 。
sitemake 为创建监测站点按钮的函数:通过监测站点列表逐个创建按钮。
def clickRefresh():  #重新读取数据
global data
df = pd.read_html("http://www.86pm25.com/city/beijing.html")
data=df[0]
rbSite() #更新监测站点的数据 def sitemake(): #建立监测站点按钮
global sitelist, listradio
for c1 in sitelist: #逐一建立按钮
rbtem = tk.Radiobutton(frame2, text=c1, variable=site, value=c1, command=rbSite) #建立单选按钮
listradio.append(rbtem) #插入至按钮列表
if(c1==sitelist[0]): #默认选取第1个按钮
rbtem.select()
rbtem.pack(side="left") #靠左对齐
import tkinter as tk
import pandas as pd df = pd.read_html("http://www.86pm25.com/city/beijing.html")
data=df[0]
print(data)
win=tk.Tk()
win.geometry("640x270")
win.title("PM2.5 实时监测")
city = tk.StringVar() #区县名称变量
site = tk.StringVar() #监测站点名称变量
result1 = tk.StringVar() #显示信息变量
citylist = [] #区县列表
sitelist = [] #监测站点列表
listradio = [] #区县按钮列表
#建立区县列表
for c1 in data["区县"]:
if(c1 not in citylist): #如果列表中不存在该县区就将该县区名称插入列表
citylist.append(c1)
#建立第1个区县的监测站点列表
count = 0
for c1 in data["区县"]:
if(c1 == citylist[0]): #如果是第1个区县,则
sitelist.append(data.ix[count, 1]) #把该区县的所有监测站点插入到监测站点列表
count += 1
label1 = tk.Label(win, text="区县:", pady=6, fg="blue", font=("新细明体", 12))
label1.pack()
frame1 = tk.Frame(win) #区县容器
frame1.pack()
for i in range(0,2): #按钮分2行
for j in range(0,8): #每行8个
n = i * 8 + j #第n个按钮
if(n < len(citylist)):
city1 = citylist[n] #取得区县名称
rbtem = tk.Radiobutton(frame1, text=city1, variable=city, value=city1, command=rbCity) #建立单选按钮
rbtem.grid(row=i, column=j) #设置按钮的位置
if(n==0): #选取第1个区县
rbtem.select() label2 = tk.Label(win, text="监测站点:", pady=6, fg="blue", font=("新细明体", 12))
label2.pack()
frame2 = tk.Frame(win) #监测站点容器
frame2.pack()
sitemake()
btnDown = tk.Button(win, text="更新数据", font=("新细明体", 12), command=clickRefresh)
btnDown.pack(pady=6)
lblResult1 = tk.Label(win, textvariable=result1, fg="red", font=("新细明体", 16))
lblResult1.pack(pady=6)
rbSite() #显示测站讯息
win.mainloop()

最新文章

  1. WEB项目会话集群的三种办法
  2. Laravel 5.3 auth中间件底层实现详解
  3. 在 CentOS7 上部署 zookeeper 服务
  4. C#获取实体类属性名称
  5. 关于Linux的 /sbin权限问题
  6. HDU 1010 Tempter of the Bone
  7. ANT编译build.xml
  8. 解决oracle归档日志写满了(ORA-00257)的问题
  9. ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
  10. IOS获取来电去电来电归属系统通知达到效果(一)
  11. UUID.randomUUID().toString()
  12. Linux 系统监控常用命令
  13. php与web页面交互
  14. u盘安装centos7.6 最新版本
  15. 安装SQL server 2008 R2和QL server 2008,与SQL server 2008升级SQL server 2008 R2
  16. NYOJ37-回文字符串(dp)
  17. C# 线程中使用delegate对控件进行操作
  18. 《Linux内核分析》第二周笔记 操作系统是如何工作的
  19. iOS 获取设备型号 ip6更新
  20. Delphi应用程序的调试(五)其他调试工具

热门文章

  1. mybatis中foreach collection的三种用法
  2. 吴裕雄--天生自然 JAVASCRIPT开发学习:弹窗
  3. Codeforces 1295C - Obtain The String
  4. Activity的Launch mode详解 :standard(默认), singleTop, singleTask和 singleInstance
  5. Python笔记_第四篇_高阶编程_实例化方法、静态方法、类方法和属性方法概念的解析。
  6. Paper Review: Epigenetic Landscape, Cell Differentiation 02
  7. 一文彻底搞懂Cookie、Session、Token到底是什么
  8. 面试必问之http以及浏览器相关知识
  9. static_cast 与 dynamic_caste, reinterpreter 的区别
  10. Xpath编码问题解决