首页 > 编程语言 >Python实现快速获取历史气象数据

Python实现快速获取历史气象数据

时间:2024-06-18 09:30:07浏览次数:13  
标签:name Python text 获取 grid tk df row 气象

利用Python中pandas库的read_html功能从网站查历史天气 (q-weather.info)获取历史气象数据,并使用tkinter库实现窗口可视化。

代码如下:

1.首先导入必要的库:

import tkinter as tk
from tkinter import messagebox
import pandas as pd

2.定义一个用法,使用户可以查看所有气象基准站(截至2018年,来源:2018年 中国基准、基本气象站 站点信息_昆明市气象站点站号-CSDN博客

def namelist():
    error_label.config(text="")
    messagebox.showinfo("基站名录",'#这里写入基站名录')

3.为方便用户使用,提供根据城市查询站点的功能:同样是定义一个用法,从台站编号.xlsx中获取相关信息,同时如果出现错误,显示错误信息。(文件附文章末)

def sake():
    error_label.config(text="")

    def sss():
        error_label.config(text="")
        city_name = city_name_entry.get()
        try:
            df = pd.read_excel('台站编号.xlsx')
            name = df.loc[df['city'] == city_name, 'name']
            if not name.empty:
                message_str = "\n".join(f"{index}: {value}" for index, value in name.items())
                messagebox.showinfo("成功",message_str)
            else:
                messagebox.showinfo("失败", '未匹配到相应站点')
        except Exception as e:
            error_label.config(text=str(e))

    root1 = tk.Tk()
    root1.title("城市对应台站查询")
    tk.Label(root1, text="请输入城市名字:").grid(row=0, column=0)
    city_name_entry = tk.Entry(root1)
    city_name_entry.grid(row=0, column=1)
    query_button3 = tk.Button(root1, text="查询", command=sss)
    query_button3.grid(row=2, column=0)

4.实现获取数据的功能,也是定义一个用法:

def get_station_info():
    error_label.config(text="")
    input_name = station_name_entry.get()
    date_time = date_time_entry.get()

    try:
        df = pd.read_excel('台站编号.xlsx')
        print_number = df.loc[df['name'] == input_name, 'number']
        if not print_number.empty:
            number = print_number.item()
            url = 'https://q-weather.info/weather/' + str(number) + '/history/?date=' + str(date_time)
            messagebox.showinfo("成功", "台站信息已处理,正在输出数据,请稍后...(点击确认继续)")
            tables_df = pd.DataFrame()
            tables_df = tables_df._append(pd.read_html(url))
            tables_df.to_csv(input_name + date_time + '.csv', encoding='gbk')
            df_str = tables_df.to_string()
            messagebox.showinfo("成功", df_str)
            messagebox.showinfo("成功", "目标数据已输出到//气象数据获取//文件夹中")
        else:
            error_label.config(text="未找到匹配的台站名称。")
    except Exception as e:
        error_label.config(text=str(e))

5.最后,实现窗口的可视化,并可让用户在窗口中输入相关信息,通过三按钮链接到三个用法:

root = tk.Tk()
root.title("台站信息查询")
tk.Label(root, text="请输入台站名称:").grid(row=0, column=0)
station_name_entry = tk.Entry(root)
station_name_entry.grid(row=0, column=1)

tk.Label(root, text="请输入时间(格式如YYYY-MM-DD): ").grid(row=1, column=0)
date_time_entry = tk.Entry(root)
date_time_entry.grid(row=1, column=1)
query_button = tk.Button(root, text="查询", command=get_station_info)
query_button1 = tk.Button(root, text="基站名录", command=namelist)
query_button2 = tk.Button(root, text="基站查询", command=sake)
query_button.grid(row=2, column=1)
query_button1.grid(row=2, column=0)
query_button2.grid(row=2, column=2)
error_label = tk.Label(root, text="", fg="red")
error_label.grid(row=3, column=1)
root.mainloop()

6.完整代码:

#encoding=UTF-8
import tkinter as tk
from tkinter import messagebox
import pandas as pd
def namelist():
    error_label.config(text="")
    messagebox.showinfo("基站名录","#这里写入基站名录")


def sake():
    error_label.config(text="")

    def sss():
        error_label.config(text="")
        city_name = city_name_entry.get()
        try:
            df = pd.read_excel('台站编号.xlsx')
            name = df.loc[df['city'] == city_name, 'name']
            if not name.empty:
                message_str = "\n".join(f"{index}: {value}" for index, value in name.items())
                messagebox.showinfo("成功",message_str)
            else:
                messagebox.showinfo("失败", '未匹配到相应站点')
        except Exception as e:
            error_label.config(text=str(e))

    root1 = tk.Tk()
    root1.title("城市对应台站查询")
    tk.Label(root1, text="请输入城市名字:").grid(row=0, column=0)
    city_name_entry = tk.Entry(root1)
    city_name_entry.grid(row=0, column=1)
    query_button3 = tk.Button(root1, text="查询", command=sss)
    query_button3.grid(row=2, column=0)

def get_station_info():
    error_label.config(text="")
    input_name = station_name_entry.get()
    date_time = date_time_entry.get()

    try:
        df = pd.read_excel('台站编号.xlsx')
        print_number = df.loc[df['name'] == input_name, 'number']
        if not print_number.empty:
            number = print_number.item()
            url = 'https://q-weather.info/weather/' + str(number) + '/history/?date=' + str(date_time)
            messagebox.showinfo("成功", "台站信息已处理,正在输出数据,请稍后...(点击确认继续)")
            tables_df = pd.DataFrame()
            tables_df = tables_df._append(pd.read_html(url))
            tables_df.to_csv(input_name + date_time + '.csv', encoding='gbk')
            df_str = tables_df.to_string()
            messagebox.showinfo("成功", df_str)
            messagebox.showinfo("成功", "目标数据已输出到//气象数据获取//文件夹中")
        else:
            error_label.config(text="未找到匹配的台站名称。")
    except Exception as e:
        error_label.config(text=str(e))
root = tk.Tk()
root.title("台站信息查询")
tk.Label(root, text="请输入台站名称:").grid(row=0, column=0)
station_name_entry = tk.Entry(root)
station_name_entry.grid(row=0, column=1)

tk.Label(root, text="请输入时间(格式如YYYY-MM-DD): ").grid(row=1, column=0)
date_time_entry = tk.Entry(root)
date_time_entry.grid(row=1, column=1)
query_button = tk.Button(root, text="查询", command=get_station_info)
query_button1 = tk.Button(root, text="基站名录", command=namelist)
query_button2 = tk.Button(root, text="基站查询", command=sake)
query_button.grid(row=2, column=1)
query_button1.grid(row=2, column=0)
query_button2.grid(row=2, column=2)
error_label = tk.Label(root, text="", fg="red")
error_label.grid(row=3, column=1)
root.mainloop()

7.运行效果:

可以通过点击‘基站名录’查看所有基站,点击基站查询:

输入城市名称查询相应站点:

输入站点名称和时间查询数据:

点击查询:

相关数据会保存到文件夹中:

第一次写文章,代码有不足之处还请各位大佬多多指正

台站信息参考文章2018年 中国基准、基本气象站 站点信息_昆明市气象站点站号-CSDN博客

保留台站编号、台站名称和城市,分别命名为number,name,city

标签:name,Python,text,获取,grid,tk,df,row,气象
From: https://blog.csdn.net/nan_xi_/article/details/139760283

相关文章

  • 深入解析:如何通过Python脚本将YOLO标注格式转换为COCO格式并进行验证
    深入解析:如何通过Python脚本将YOLO标注格式转换为COCO格式并进行验证随着深度学习和计算机视觉技术的飞速发展,物体检测成为了一个热门的研究领域。在物体检测任务中,YOLO(YouOnlyLookOnce)和COCO(CommonObjectsinContext)是两个非常重要的标注格式。YOLO因其高效的实时物......
  • 深入解析:如何通过Python脚本将LabelMe标注格式转换为YOLO格式并进行验证
    深入解析:如何通过Python脚本将LabelMe标注格式转换为YOLO格式并进行验证在计算机视觉领域,标注格式的转换是一个经常会遇到的问题。不同的标注格式有不同的应用场景和优势,能够灵活地进行转换是非常重要的技能。在这篇文章中,我们将详细介绍如何通过Python脚本将LabelMe标注格......
  • 【python】OpenCV—Segmentation
    文章目录cv2.kmeans牛刀小试cv2.kmeanscv2.kmeans是OpenCV库中用于执行K-Means聚类算法的函数。以下是根据参考文章整理的cv2.kmeans函数的中文文档:一、函数功能cv2.kmeans用于执行K-Means聚类算法,将一组数据点划分到K个簇中,使得簇内的数据点尽可能相......
  • 使用Python获取HTTP请求头数据
    前言在Web开发和API交互中,HTTP请求头扮演着至关重要的角色。它们不仅告诉服务器请求的类型(如GET、POST等),还包含了关于客户端、请求内容以及其他重要信息的数据。在Python中,我们可以使用requests库来发送HTTP请求,并查看服务器返回的响应头,但通常我们也需要了解我们发送的请求头内......
  • Python - class Method and static Method
    Themethodsinaclassareassociatedwiththeobjectscreatedforit.Forinvokingthemethodsdefinedinsidethemethod,thepresenceofaninstanceisnecessary.Theclassmethodisamethodthatisalsodefinedinsidetheclassbutdoesnotneedanyob......
  • 精准控制:Python 输入数值范围限制详解
    前言在实际开发过程中,经常需要对用户输入的数值进行限制,以确保输入的数据在合理的范围内。这不仅能防止程序错误,还能提高用户体验。作为一名测试工程师,掌握如何在Python中限制输入数值范围是非常有用的技能。本文将详细介绍如何使用Python实现这一功能,包括基础方法和高级应用......
  • 用Xpath制作简单爬虫工具,获取神奇宝贝百科的精灵信息
    最近开始学习Python的爬虫应用,个人比较喜欢用Xpath的方式来爬取数据,今天就结合一下Xpath方式,以“神奇宝贝百科”为素材,制作一个爬取每只宝可梦数据的工程项目准备工作神奇宝贝百科地址:https://wiki.52poke.com/wiki/主页工程项目的目标是,获取每只精灵的名字、编号、属性、特性......
  • Python - Overloading
    ObjectOrientedProgramming(OOP)allowstheprogrammerstoaddsomeadditionalfunctionalitiestotheoperatorsandmethodswhichhavebasicproperties.Suchakindofredefiningoftheentitiesoftheprogrammingstructureiscalledaspolymorphism.In......
  • Python函数式编程
    函数式编程基础函数式编程与面向对象编程一样都是一种编程范式,函数式编程也称为面向函数的编程。Python提供了高阶函数、函数类型和lambda表达式,他们是实现函数式编程的基础。高阶函数与函数类型如果一个函数可以作为其他函数的参数或者其他函数的返回值,那么这个函数就是“......
  • 用Xpath制作简单的爬取网页工具,获取神奇宝贝百科每只精灵的信息
    最近开始学习Python的爬虫应用,个人比较喜欢用Xpath的方式来爬取数据,今天就结合一下Xpath方式,以“神奇宝贝百科”为素材,制作一个爬取每只宝可梦数据的工程项目准备工作神奇宝贝百科地址:https://wiki.52poke.com/wiki/主页工程项目的目标是,获取每只精灵的名字、编号、属性、特性......