用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/

相关推荐
Codebee4 小时前
能力中心 (Agent SkillCenter):开启AI技能管理新时代
人工智能
聆风吟º4 小时前
CANN runtime 全链路拆解:AI 异构计算运行时的任务管理与功能适配技术路径
人工智能·深度学习·神经网络·cann
uesowys5 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
AI_56785 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
User_芊芊君子5 小时前
CANN大模型推理加速引擎ascend-transformer-boost深度解析:毫秒级响应的Transformer优化方案
人工智能·深度学习·transformer
ValhallaCoder5 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
智驱力人工智能5 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
qq_160144875 小时前
亲测!2026年零基础学AI的入门干货,新手照做就能上手
人工智能
Howie Zphile5 小时前
全面预算管理难以落地的核心真相:“完美模型幻觉”的认知误区
人工智能·全面预算
人工不智能5775 小时前
拆解 BERT:Output 中的 Hidden States 到底藏了什么秘密?
人工智能·深度学习·bert