用MeteoStat计算任意时刻经纬度真实气象数据

在气象数据分析、地理信息系统开发、农业气象等场景中,我们经常需要获取指定经纬度、指定时刻的真实气象数据。MeteoStat 是一个免费的气象数据 API 服务,提供全球范围内的历史和实时气象数据,其 Python 库更是让数据获取变得简单高效。

二、MeteoStat 基础介绍

2.1 MeteoStat 是什么?

MeteoStat 是一个开源的气象数据平台,整合了来自全球气象站的官方数据,提供包括温度、湿度、风速、气压、降水量等在内的多维度气象指标。其 Python 库封装了 API 调用逻辑,无需手动处理 HTTP 请求,开箱即用。

2.2 核心优势

  • 免费使用(非商业场景),无需 API 密钥;
  • 支持按经纬度、时间范围精准查询;
  • 数据覆盖全球,包含历史和实时数据;
  • Python 库接口简洁,易于集成到项目中。

项目的官方文档:https://dev.meteostat.net/python

三、环境准备

3.1 安装依赖库

首先安装 MeteoStat 的 Python 库,同时推荐安装pandas(数据处理)和pytz(时区处理):

复制代码
pip install meteostat pandas pytz

3.2 依赖说明

  • meteostat:核心库,用于调用 MeteoStat API;
  • pandas:将返回的气象数据转换为易读的 DataFrame 格式;
  • pytz:处理时区问题,确保时间参数的准确性。

四、核心代码实现

4.1 完整代码

以下代码实现 "输入经纬度、起始 / 结束时间,获取对应时段的气象数据",支持任意时刻(精确到小时)的查询:

python 复制代码
from meteostat import Point, Hourly
from datetime import datetime
import pytz
import pandas as pd

def get_meteo_data(lat: float, lon: float, start_time: datetime, end_time: datetime):
    """
    获取指定经纬度、指定时间段的逐小时气象数据
    
    参数:
        lat: 纬度(例如:39.9042,北京)
        lon: 经度(例如:116.4074,北京)
        start_time: 起始时间(datetime对象,需带时区)
        end_time: 结束时间(datetime对象,需带时区)
    
    返回:
        pandas.DataFrame: 包含时间、温度、湿度、风速、气压、降水量等气象指标
    """
    # 1. 创建经纬度点对象
    point = Point(lat, lon)
    
    # 2. 获取逐小时气象数据
    hourly_data = Hourly(point, start_time, end_time)
    # 3. 加载数据并转换为DataFrame(fill_missing=True自动填充缺失值)
    data = hourly_data.fetch(fill_missing=True)
    
    # 4. 数据整理:重命名列名(中文更易读)、重置索引
    data.rename(
        columns={
            'temp': '温度(℃)',
            'dwpt': '露点温度(℃)',
            'rhum': '相对湿度(%)',
            'prcp': '降水量(mm)',
            'wspd': '风速(km/h)',
            'pres': '气压(hPa)',
            'wdir': '风向(°)',
            'coco': '天气状况代码'
        },
        inplace=True
    )
    # 重置索引(将时间从索引转为列)
    data.reset_index(inplace=True)
    # 格式化时间列(便于阅读)
    data['time'] = data['time'].dt.strftime('%Y-%m-%d %H:%M:%S')
    
    return data

if __name__ == "__main__":
    # 示例:获取北京(39.9042, 116.4074)2025年1月1日0点到1点的气象数据
    # 注意:时间必须带时区(MeteoStat默认使用UTC,建议统一转换为UTC避免误差)
    tz = pytz.UTC
    start = tz.localize(datetime(2025, 1, 1, 0, 0, 0))
    end = tz.localize(datetime(2025, 1, 1, 1, 0, 0))
    
    # 调用函数获取数据
    beijing_meteo = get_meteo_data(39.9042, 116.4074, start, end)
    
    # 打印结果
    print("北京2025年1月1日0-1点气象数据:")
    print(beijing_meteo)
    
    # 可选:将数据保存为CSV文件
    beijing_meteo.to_csv("beijing_meteo_data.csv", index=False, encoding='utf-8')

4.2 代码关键说明

  1. Point 对象Point(lat, lon) 是 MeteoStat 的核心对象,用于定位指定经纬度的位置,底层会自动匹配该位置最近的气象站数据;
  2. Hourly 类 :用于获取逐小时气象数据(若需按天查询可使用Daily类,按分钟查询可用Minute类),参数包括定位点、起始时间、结束时间;
  3. 时区处理 :MeteoStat 的时间默认基于 UTC,因此必须为datetime对象指定时区(pytz.UTC),否则会报错或返回错误数据;
  4. 数据填充fetch(fill_missing=True) 会自动填充少量缺失的气象数据,避免数据断档;
  5. 列名重命名:将 MeteoStat 默认的英文列名转为中文,提升可读性。

五、运行结果示例

执行上述代码后,输出结果如下:

复制代码
北京2025年1月1日0-1点气象数据:
                 time  温度(℃)  露点温度(℃)  相对湿度(%)  降水量(mm)  风速(km/h)  气压(hPa)  风向(°)  天气状况代码
0  2025-01-01 00:00:00     -5.2       -8.1        81.0        0.0        2.6    1020.0    350.0         2.0
1  2025-01-01 01:00:00     -5.5       -8.5        80.0        0.0        2.8    1020.2    355.0         2.0

六、常见问题与解决方案

6.1 数据返回为空

  • 原因:指定的经纬度附近无气象站,或时间范围超出 MeteoStat 的数据覆盖范围;
  • 解决方案:调整经纬度(例如向城市中心偏移),或检查时间范围(MeteoStat 的历史数据通常覆盖近几十年)。

6.2 时区错误

  • 原因:datetime对象未指定时区,或时区不统一;
  • 解决方案:统一使用pytz.UTC为时间对象指定时区,避免本地时区与 UTC 的偏差。

6.3 部分字段为 NaN

  • 原因:气象站未采集该指标,或数据缺失;
  • 解决方案:fetch(fill_missing=True) 可填充部分缺失值,也可通过data.fillna(0)手动填充。

七、进阶扩展

  1. 批量查询多地点 :循环调用get_meteo_data函数,传入不同经纬度,实现多区域气象数据批量获取;
  2. 可视化展示 :结合matplotlib/seaborn绘制温度、湿度的时间变化曲线;
  3. 实时数据获取 :将start_timeend_time设为当前时间(datetime.now(tz)),获取实时气象数据;
  4. 更多指标 :MeteoStat 还提供日照时长、雪深等指标,可在rename中添加对应列名。

八、总结

  1. MeteoStat Python 库是获取全球气象数据的高效工具,无需 API 密钥,调用简单;
  2. 核心步骤为:创建Point定位点 → 实例化Hourly/Daily类 → fetch()加载数据 → 整理输出;
  3. 时区处理是关键,必须为datetime对象指定 UTC 时区,避免数据时间偏差。

参考内容:

历史天气官方数据:https://worldweatherdata.com/ja/

Meteostat:https://dev.meteostat.net/

相关推荐
美酒没故事°1 天前
Open WebUI安装指南。搭建自己的自托管 AI 平台
人工智能·windows·ai
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Csvn1 天前
🌟 LangChain 30 天保姆级教程 · Day 13|OutputParser 进阶!让 AI 输出自动转为结构化对象,并支持自动重试!
python·langchain
AI攻城狮1 天前
用 Obsidian CLI + LLM 构建本地 RAG:让你的笔记真正「活」起来
人工智能·云原生·aigc
鸿乃江边鸟1 天前
Nanobot 从onboard启动命令来看个人助理Agent的实现
人工智能·ai
lpfasd1231 天前
基于Cloudflare生态的应用部署与开发全解
人工智能·agent·cloudflare
俞凡1 天前
DevOps 2.0:智能体如何接管故障修复和基础设施维护
人工智能
comedate1 天前
[OpenClaw] GLM 5 关于电影 - 人工智能 - 的思考
人工智能·电影评价
财迅通Ai1 天前
6000万吨产能承压 卫星化学迎来战略窗口期
大数据·人工智能·物联网·卫星化学
liliangcsdn1 天前
Agent Memory智能体记忆系统的示例分析
数据库·人工智能·全文检索