在气象数据分析、地理信息系统开发、农业气象等场景中,我们经常需要获取指定经纬度、指定时刻的真实气象数据。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 代码关键说明
- Point 对象 :
Point(lat, lon)是 MeteoStat 的核心对象,用于定位指定经纬度的位置,底层会自动匹配该位置最近的气象站数据; - Hourly 类 :用于获取逐小时气象数据(若需按天查询可使用
Daily类,按分钟查询可用Minute类),参数包括定位点、起始时间、结束时间; - 时区处理 :MeteoStat 的时间默认基于 UTC,因此必须为
datetime对象指定时区(pytz.UTC),否则会报错或返回错误数据; - 数据填充 :
fetch(fill_missing=True)会自动填充少量缺失的气象数据,避免数据断档; - 列名重命名:将 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)手动填充。
七、进阶扩展
- 批量查询多地点 :循环调用
get_meteo_data函数,传入不同经纬度,实现多区域气象数据批量获取; - 可视化展示 :结合
matplotlib/seaborn绘制温度、湿度的时间变化曲线; - 实时数据获取 :将
start_time和end_time设为当前时间(datetime.now(tz)),获取实时气象数据; - 更多指标 :MeteoStat 还提供日照时长、雪深等指标,可在
rename中添加对应列名。
八、总结
- MeteoStat Python 库是获取全球气象数据的高效工具,无需 API 密钥,调用简单;
- 核心步骤为:创建
Point定位点 → 实例化Hourly/Daily类 →fetch()加载数据 → 整理输出; - 时区处理是关键,必须为
datetime对象指定 UTC 时区,避免数据时间偏差。
参考内容:
历史天气官方数据:https://worldweatherdata.com/ja/
Meteostat:https://dev.meteostat.net/