Open-Meteo完全免费的天气 API查询

Open-Meteo 是一个完全免费的天气 API,支持获取非常详细的天气信息。让我为你创建一个完整的代码,获取并输出所有可用的天气数据:

python 复制代码
import requests
from datetime import datetime

def get_comprehensive_weather_openmeteo(lng, lat):
    """
    使用 Open-Meteo 获取完整的天气信息
    """
    url = "https://api.open-meteo.com/v1/forecast"
    params = {
        "latitude": lat,
        "longitude": lng,
        "current_weather": True,
        "hourly": [
            "temperature_2m", "relativehumidity_2m", "apparent_temperature",
            "precipitation", "rain", "showers", "snowfall", "snow_depth",
            "pressure_msl", "surface_pressure", "cloudcover", "cloudcover_low",
            "cloudcover_mid", "cloudcover_high", "shortwave_radiation",
            "direct_radiation", "diffuse_radiation", "direct_normal_irradiance",
            "evapotranspiration", "et0_fao_evapotranspiration", "vapor_pressure_deficit",
            "windspeed_10m", "windspeed_80m", "windspeed_120m", "windspeed_180m",
            "winddirection_10m", "winddirection_80m", "winddirection_120m", "winddirection_180m",
            "windgusts_10m", "temperature_80m", "temperature_120m", "temperature_180m",
            "soil_temperature_0cm", "soil_temperature_6cm", "soil_temperature_18cm", "soil_temperature_54cm",
            "soil_moisture_0_1cm", "soil_moisture_1_3cm", "soil_moisture_3_9cm", "soil_moisture_9_27cm", "soil_moisture_27_81cm"
        ],
        "daily": [
            "weathercode", "temperature_2m_max", "temperature_2m_min", "apparent_temperature_max",
            "apparent_temperature_min", "precipitation_sum", "rain_sum", "showers_sum", "snowfall_sum",
            "precipitation_hours", "sunrise", "sunset", "windspeed_10m_max", "windgusts_10m_max",
            "winddirection_10m_dominant", "shortwave_radiation_sum", "et0_fao_evapotranspiration"
        ],
        "timezone": "Asia/Shanghai",
        "forecast_days": 7  # 预报7天
    }
    
    try:
        response = requests.get(url, params=params, timeout=15)
        if response.status_code == 200:
            data = response.json()
            return data
        else:
            print(f"API 错误: {response.status_code}")
            print(f"响应内容: {response.text}")
            return None
    except Exception as e:
        print(f"请求失败: {e}")
        return None

def format_weather_data(data):
    """
    格式化并输出完整的天气信息
    """
    if not data:
        return
    
    print("=" * 60)
    print("Open-Meteo 完整天气信息")
    print("=" * 60)
    
    # 当前天气信息
    print("\n📍 当前天气:")
    print("-" * 30)
    current = data.get("current_weather", {})
    if current:
        print(f"经度: {data.get('longitude')}")
        print(f"纬度: {data.get('latitude')}")
        print(f"时区: {data.get('timezone')}")
        print(f"当前温度: {current.get('temperature', 'N/A')}°C")
        print(f"当前风速: {current.get('windspeed', 'N/A')} km/h")
        print(f"当前风向: {current.get('winddirection', 'N/A')}°")
        print(f"当前天气代码: {current.get('weathercode', 'N/A')}")
        print(f"观测时间: {current.get('time', 'N/A')}")
        print(f"是否为降水: {current.get('is_day', 'N/A')}")
    
    # 小时预报(前12小时)
    print("\n⏰ 12小时预报:")
    print("-" * 30)
    hourly = data.get("hourly", {})
    if hourly:
        times = hourly.get("time", [])[:12]
        temps = hourly.get("temperature_2m", [])[:12]
        hums = hourly.get("relativehumidity_2m", [])[:12]
        precips = hourly.get("precipitation", [])[:12]
        winds = hourly.get("windspeed_10m", [])[:12]
        
        for i in range(len(times)):
            print(f"{times[i]}: "
                  f"温度 {temps[i]}°C, "
                  f"湿度 {hums[i]}%, "
                  f"降水 {precips[i]}mm, "
                  f"风速 {winds[i]}km/h")
    
    # 日预报
    print("\n📅 7天预报:")
    print("-" * 30)
    daily = data.get("daily", {})
    if daily:
        times = daily.get("time", [])
        max_temps = daily.get("temperature_2m_max", [])
        min_temps = daily.get("temperature_2m_min", [])
        precips = daily.get("precipitation_sum", [])
        sunrises = daily.get("sunrise", [])
        sunsets = daily.get("sunset", [])
        
        for i in range(len(times)):
            print(f"{times[i]}: "
                  f"最高温 {max_temps[i]}°C, "
                  f"最低温 {min_temps[i]}°C, "
                  f"总降水 {precips[i]}mm")
            print(f"  日出: {sunrises[i] if i < len(sunrises) else 'N/A'}, "
                  f"日落: {sunsets[i] if i < len(sunsets) else 'N/A'}")
    
    # 详细小时数据(部分)
    print("\n📊 详细小时数据 (前3小时):")
    print("-" * 30)
    if hourly:
        for key, values in hourly.items():
            if key != "time":  # 跳过时间字段
                print(f"{key}: {values[:3] if len(values) >= 3 else values}")
    
    # 每日详细数据
    print("\n📈 每日详细数据:")
    print("-" * 30)
    if daily:
        for key, values in daily.items():
            if key != "time":  # 跳过时间字段
                print(f"{key}: {values}")
    
    # 元数据
    print("\n🔧 API 元数据:")
    print("-" * 30)
    print(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print(f"海拔: {data.get('elevation', 'N/A')}m")
    print(f"时区缩写: {data.get('timezone_abbreviation', 'N/A')}")
    print(f"UTC 偏移: {data.get('utc_offset_seconds', 'N/A')}秒")

# ===== 使用示例 =====
if __name__ == "__main__":
    # 北京坐标 (GCJ-02 坐标可以直接使用,偏差不大)
    lng, lat = 116.481488, 39.990464
    
    print("正在获取 Open-Meteo 天气数据...")
    weather_data = get_comprehensive_weather_openmeteo(lng, lat)
    
    if weather_data:
        format_weather_data(weather_data)
    else:
        print("未能获取天气数据")

Open-Meteo 支持的天气信息包括:
🌡️ 温度相关

temperature_2m: 2米高温度

apparent_temperature: 体感温度

不同高度的温度: temperature_80m, temperature_120m, temperature_180m
💧 降水相关

precipitation: 总降水

rain: 雨量

showers: 阵雨

snowfall: 降雪

snow_depth: 雪深
💨 风相关

windspeed_10m: 10米风速

windspeed_80m/120m/180m: 不同高度风速

winddirection_10m: 风向

windgusts_10m: 阵风
☁️ 云和辐射

cloudcover: 总云量

cloudcover_low/mid/high: 各层云量

shortwave_radiation: 短波辐射

direct_radiation: 直射辐射
🌞 日照相关

sunrise: 日出

sunset: 日落

precipitation_hours: 降水小时数
🌱 土壤相关

soil_temperature: 不同深度土壤温度

soil_moisture: 不同深度土壤湿度
📊 其他指标

pressure_msl: 海平面气压

relativehumidity_2m: 相对湿度

evapotranspiration: 蒸散发

et0_fao_evapotranspiration: FAO 蒸散发

这个 API 完全免费,无需 API Key,支持中文时区,是获取详细天气数据的好选择!

相关推荐
b2077219 小时前
Flutter for OpenHarmony 身体健康状况记录App实战 - 健康目标实现
python·flutter·harmonyos
lixin5565569 小时前
基于深度生成对抗网络的高质量图像生成模型研究与实现
java·人工智能·pytorch·python·深度学习·语言模型
无望__wsk9 小时前
Python第一次作业
开发语言·python·算法
南 阳10 小时前
Python从入门到精通day16
开发语言·python·算法
MasonYyp10 小时前
Agno中使用MCP
python
aiguangyuan10 小时前
从零实现循环神经网络:中文情感分析的完整实践指南
人工智能·python·nlp
喵手10 小时前
Python爬虫零基础入门【第九章:实战项目教学·第1节】通用新闻采集器:从零打造可复用的静态站模板!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·新闻采集器·静态站模版
摸鱼仙人~10 小时前
从 Gunicorn 到 FastAPI:Python Web 生产环境架构演进与实战指南
python·fastapi·gunicorn
毕设源码-朱学姐11 小时前
【开题答辩全过程】以 基于Django框架中山社区社会补助系统为例,包含答辩的问题和答案
后端·python·django
醉舞经阁半卷书111 小时前
Matplotlib从入门到精通
python·数据分析·matplotlib