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

相关推荐
YMLT花岗岩2 小时前
Python学习之-函数-入门训练-具有多个返回值的函数
python·学习
星瞳科技OpenMV2 小时前
星瞳OpenMV官方机械臂教程|从零开始:Robot Arm机械臂快速上手
arm开发·图像处理·python·计算机视觉·ai·机器人·openmv
小王努力学编程2 小时前
LangChain——AI应用开发框架(核心组件1)
linux·服务器·前端·数据库·c++·人工智能·langchain
写代码的【黑咖啡】2 小时前
Python中的lxml:高效XML处理库
xml·开发语言·python
庄小焱2 小时前
【机器学习】——房屋销售价格预测实战
人工智能·算法·机器学习·预测模型
人工智能AI技术2 小时前
【Agent从入门到实践】29 开发第一个Agent——需求定义
人工智能·python
爱喝可乐的老王2 小时前
深度学习初认识
人工智能·深度学习
前端达人2 小时前
为什么聪明的工程师都在用TypeScript写AI辅助代码?
前端·javascript·人工智能·typescript·ecmascript
AI科技星2 小时前
张祥前统一场论的数学表述与概念梳理:从几何公设到统一场方程
人工智能·线性代数·算法·机器学习·矩阵·数据挖掘