python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python获取天气数据

Python实现获取近期天气数据并显示在窗口

作者:ice813033181

这篇文章主要为大家详细介绍了Python如何通过调用wttr.in天气API获取指定城市(如上海)的实时天气数据,并使用Tkinter构建图形界面展示,感兴趣的小伙伴可以了解下

借助AI实现获取指定地区的天气的代码,现在以上海天气举例,代码原理是获取指定网址网页的天气数据,在窗口中显示。

效果图:

代码演示:

import tkinter as tk
from tkinter import ttk
import requests
import json
from datetime import datetime

def get_weather(city="Shanghai"):
    """获取天气数据Shanghai Beijing"""
    url = f"https://wttr.in/{city}?format=j1&lang=zh"
    try:
        resp = requests.get(url, timeout=10)
        data = resp.json()
        
        current = data['current_condition'][0]
        
        weather_info = {
            "城市": city,
            "温度": f"{current['temp_C']}°C",
            "体感": f"{current['FeelsLikeC']}°C",
            "天气": current['lang_zh'][0]['value'],
            "湿度": f"{current['humidity']}%",
            "风速": f"{current['windspeedKmph']} km/h",
            "更新时间": datetime.now().strftime("%H:%M:%S")
        }
        return weather_info
    except Exception as e:
        return {"错误": str(e)}

def create_window():
    root = tk.Tk()
    root.title("实时天气")
    root.geometry("400x350")
    root.resizable(False, False)
    
    # 标题
    title_label = tk.Label(root, text="🌤 天气信息", font=("微软雅黑", 18, "bold"))
    title_label.pack(pady=15)
    
    # 天气数据容器
    info_frame = tk.Frame(root)
    info_frame.pack(pady=10, padx=20, fill="both", expand=True)
    
    weather = get_weather()
    
    # 逐行显示
    for i, (key, value) in enumerate(weather.items()):
        frame = tk.Frame(info_frame)
        frame.pack(fill="x", pady=5)
        
        label = tk.Label(frame, text=f"{key}:", font=("微软雅黑", 11), width=8, anchor="w")
        label.pack(side="left")
        
        value_label = tk.Label(frame, text=str(value), font=("微软雅黑", 11, "bold"))
        value_label.pack(side="left")
    
    # 刷新按钮
    def refresh():
        for widget in info_frame.winfo_children():
            widget.destroy()
        weather = get_weather()
        for i, (key, value) in enumerate(weather.items()):
            frame = tk.Frame(info_frame)
            frame.pack(fill="x", pady=5)
            label = tk.Label(frame, text=f"{key}:", font=("微软雅黑", 11), width=8, anchor="w")
            label.pack(side="left")
            value_label = tk.Label(frame, text=str(value), font=("微软雅黑", 11, "bold"))
            value_label.pack(side="left")
    
    btn = tk.Button(root, text="🔄 刷新", command=refresh, font=("微软雅黑", 10))
    btn.pack(pady=10)
    
    root.mainloop()

if __name__ == "__main__":
    create_window()

知识扩展:

Python 获取天气数据的主流方式有两种,第一种是直接调用免费天气 API,第二种是使用封装好的第三方 Python 库。如果要获取近期数据,也可以选择开放的历史数据集进行离线分析。最简单的莫过于无需 API 密钥的 Open-Meteo API,几行代码即可开始。

方案一:直连 API

这是最灵活的方法,你可以直接控制请求和处理数据。

1. 推荐方案:Open-Meteo (完全免费,无需 API Key)

Open-Meteo 是一个非常出色的免费开源气象 API,它整合了 NOAA、DWD 等多个全球气象机构的模型数据。更关键的是,它使用起来极其简单,无需注册和 API Key,非常适合快速开发。

安装依赖

pip install requests

示例代码

import requests

# 柏林的地理坐标 (纬度, 经度)
berlin_lat, berlin_lon = 52.52, 13.41

# 构建请求 URL
url = "https://api.open-meteo.com/v1/forecast"
params = {
    "latitude": berlin_lat,
    "longitude": berlin_lon,
    "current": ["temperature_2m", "relative_humidity_2m"],
    "daily": "temperature_2m_max,temperature_2m_min",
    "timezone": "auto"
}

response = requests.get(url, params=params)
data = response.json() # 解析 JSON 数据

# 获取当前温度(摄氏度)
current_temp = data['current']['temperature_2m']
# 打印结果
print(f"Berlin Current Temperature: {current_temp}°C")

提示:Open-Meteo 还提供了官方 Python 库 openmeteo-requests,如果你需要处理大量时间序列数据,这个库使用 FlatBuffers 格式,效率更高。

2. 备选方案:OpenWeatherMap

作为市场上最主流的天气 API 之一,OpenWeatherMap 凭借其庞大的社区和详尽的文档,是另一个可靠的选择。在它的免费计划下,你可以创建一个小型应用的前端雏形,并根据需求扩展。

准备工作:首先需要在 OpenWeatherMap 官网注册账号并获取 API Key。

示例代码

import requests

API_KEY = "YOUR_API_KEY"  # 替换成你的 API 密钥
city = "London"

url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}&units=metric"

response = requests.get(url)
data = response.json()

# 获取当前温度(摄氏度)
current_temp = data['main']['temp']
print(f"{city} Current Temperature: {current_temp}°C")

3. 新手友好方案:WeatherAPI

WeatherAPI.com 也是一个不错的选择。它的免费计划每月提供高达 100 万次请求,并且文档对初学者非常友好,并提供多种天气数据类型,能很好地平衡开发初期的需求。使用方式与 OpenWeatherMap 类似,同样需要注册获取 API Key。

方案二:使用第三方库

如果你不想直接处理 HTTP 请求细节,使用这些封装好的库会更方便。

1. Wetterdienst:统一访问多源数据

Wetterdienst 是一个强大的 Python 库,它提供了一个统一的接口来访问官方气象服务的数据。

安装

pip install wetterdienst

示例代码 (获取柏林某时段的气温)

from wetterdienst import Settings
from wetterdienst.provider.dwd.observation import DwdObservationRequest

# 创建一个请求,指定想要的数据集
request = DwdObservationRequest(
    parameter="temperature_air_2m",
    resolution="daily",
    period="recent",
    start_date="2023-01-01",
    end_date="2023-01-10",
)

# 过滤出柏林-达勒姆站点的数据
berlin_dahlem = request.filter_by_rank(latitude=52.46, longitude=13.30, rank=1)

# 获取数据并转换为 DataFrame
df = berlin_dahlem.values.all().to_pandas()
print(df.head())

提示:Wetterdienst 可以通过 pip 安装,且支持 Polars 等现代数据处理框架。

2. python-weather:轻量级异步库

python-weather 是一个免费的、异步的天气 API 封装器。它的代码非常简洁,适合集成到异步应用中。

安装

pip install python-weather

示例代码

import asyncio
import python_weather

async def get_weather():
    async with python_weather.Client() as client:
        weather = await client.get("New York")
        print(f"Current temperature: {weather.current.temperature}°C")

if __name__ == "__main__":
    asyncio.run(get_weather())

方案三:获取历史天气数据集

如果你需要进行大规模的数据分析,而不是实时查询,可以考虑使用现成的历史数据集。

Open-Meteo 同样提供了一个强大的历史天气 API,可以追溯到 1940 年,并支持多种数据参数。这对于学术研究或模型训练非常有价值。

示例代码

import requests
url = "https://archive-api.open-meteo.com/v1/archive"
params = {
    "latitude": 40.7128,
    "longitude": -74.0060,
    "start_date": "2025-01-01",
    "end_date": "2025-01-07",
    "daily": "temperature_2m_max,temperature_2m_min",
    "timezone": "America/New_York"
}
response = requests.get(url, params=params)
historical_data = response.json()
# 打印历史数据
print(historical_data)

到此这篇关于Python实现获取近期天气数据并显示在窗口的文章就介绍到这了,更多相关Python获取天气数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文