Py学习  »  Python

Python | 下载可视化全球任意地点的气象数据

气象学家 • 1 年前 • 1171 次点击  

LXX

读完需要

5
分钟

速读仅需 2 分钟

前言:

Meteostat是一个用于处理和分析气象数据的 Python 包。它可以通过 Meteostat API 获得全球的历史和当前天气数据。该包提供了查询特定站点、位置和时段的天气数据的功能,并允许数据进行进一步分析和可视化。

Meteostat 提供的数据类型包括:

1.每日数据(Daily):按天汇总的天气数据。

2.每小时数据(Hourly):按小时汇总的天气数据。

3.气象站:包括全球各气象站的详细信息。

今天看到群里同学需要下载气象数据,因此本文分享通过该 Python 包来下载并可视化气象数据。


希望各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)


1

   

Meteostat 包简介

Meteostat Python 库提供了一个简单的 API,用于访问开放的天气和气候数据。Meteostat 从不同的公共界面收集历史观察和统计数据,其中大部分是政府的,包括中国的气象站。数据来源包括国家海洋和大气管理局 (NOAA) 和德国国家气象局 (DWD) 等国家气象部门。

1.1

   

包含的气象数据

Meteostat 可以提供不同时间间隔(每日和每小时)的多种气象信息,包括温度、降水、风速等。

以下是 Meteostat 包可以获取的常见气象数据:

每日数据 (Daily 类)每小时数据 (Hourly 类)
tavg: 平均温度(摄氏度)temp: 气温(摄氏度)
tmin: 最低温度(摄氏度)dwpt: 露点温度(摄氏度)
tmax: 最高温度(摄氏度)rhum: 相对湿度(%)
prcp: 降水量(毫米)prcp: 降水量(毫米)
wspd: 平均风速(公里/小时)snow: 积雪深度(厘米)
wpgt: 最大风速(公里/小时)wdir: 风向(度数,0-360)
pres: 平均气压(百帕)wspd: 平均风速(公里/小时)
snow: 积雪深度(厘米)wpgt: 最大风速(公里/小时)
tsun: 日照时间(分钟)pres: 气压(百帕)

tsun: 日照时间(分钟)


1.2


   

数据结构

数据格式

https://dev.meteostat.net/python/stations.html#data-structure


2

   

Meteostat 包 Python 使用案例

Meteostat Python 包可通过 PyPI 安装:

pip install meteostat

在此示例中,将利用库的 Stations 类来创建一个图表,以可视化方式显示 BC 省温哥华 2018 年的每日气温。Daily为每日气象数据。

1.首先我们导入一些类和函数:

from datetime import datetimeimport matplotlib.pyplot as pltfrom meteostat import Stations, Daily

2.现在我们可以获取靠近我们兴趣点的气象站。只需将纬度和经度传递给该nearby方法即可:

# Get weather stations ordered by distance to Vancouver, BCstations = Stations(lat = 49.2497, lon = -123.1193, daily = datetime(2018, 1, 1))# Fetch closest station (limit = 1)station = stations.fetch(1)

3.接下来,指定一个daily参数。通过这样做,我们可以确保气象站确实提供了 2018 年的每日统计数据。调用后,fetch()变量station保存一个 Pandas DataFrame,其中包含有关我们选择的气象站的元信息。这个 DataFrame 可以传递给Daily类以访问实际的天气数据:

# Get daily data for 2018 at the selected weather stationdata = Daily(station, start = datetime(2018, 1, 1), end = datetime(2018, 12, 31))# Fetch Pandas DataFramedata = data.fetch()

4.data现在是一个 Pandas DataFrame,每天包含一行(例外:时间序列可能包含间隙)。从现在开始,我们可以在 DataFrame 上使用 Pandas 方法,并绘制折线图可视化平均、最低和最高温度:

# Plot line chart including average, minimum and maximum temperaturedata.plot(y = ['tavg', 'tmin', 'tmax'], kind = 'line')# Show chartplt.show()


3

   

Python 下载中国站点气象数据

通过以上示例我们已经知道了如何使用Meteostat Python 包,因为其中也包含了中国的气象站点,因此我们可以来尝试一下下载国内的气象数据,代码如下:

1.下载北京及附近区域站点每日气象数据

from meteostat import Stations, Point, Dailyimport matplotlib.pyplot as pltfrom datetime import datetime
# 查找北京附近的气象站stations = Stations()stations = stations.region('CN') # 'CN' 是中国的 ISO 3166 国家代码stations = stations.nearby(39.9042, 116.4074) # 北京市的坐标station_list = stations.fetch(10)
# 打印找到的前10个气象站信息print(station_list)
# 选择第一个气象站的 IDstation_id = station_list.index[0]
# 下载该气象站的每日数据data = Daily(station_id, start = datetime(2018, 1, 1), end = datetime(2018, 12, 31))data = data.fetch()data.to_csv('Daily.csv')

2.下载北京及附近区域站点每小时气象数据

from meteostat import Stations, Point, Hourlyimport matplotlib.pyplot as pltfrom datetime import datetime
# 查找北京附近的气象站stations = Stations()stations = stations.region('CN') # 'CN' 是中国的 ISO 3166 国家代码stations = stations.nearby(39.9042, 116.4074) # 北京市的坐标station_list = stations.fetch(10)
# 打印找到的前10个气象站信息print(station_list)
# 选择第一个气象站的 IDstation_id = station_list.index[0]
# 下载该气象站的每日数据data = Hourly(station_id, start = datetime(2018, 1, 1), end = datetime(2018, 12, 31))data = data.fetch()data.to_csv('Hourly.csv')

3.接下来可视化部分数据

# 创建图形fig, ax1 = plt.subplots(figsize=(10, 6))
# 绘制平均温度和风速在左纵轴ax1.plot(daily_data.index, daily_data['tavg'], color='blue', label='平均温度 (°C)')ax1.plot(daily_data.index, daily_data['wspd'], color='green', label='平均风速 (km/h)')ax1.set_xlabel('日期')ax1.set_ylabel('平均温度 (°C) / 平均风速 (km/h)')ax1.tick_params(axis='y')ax1.legend(loc='upper left')
# 创建第二个纵轴用于显示风向ax2 = ax1.twinx()ax2.plot(daily_data.index, daily_data['wdir'], color='red', label='风向 (°)')ax2.set_ylabel('风向 (°)')ax2.tick_params(axis='y')ax2.legend(loc='upper right')plt.rcParams['font.sans-serif'] = ['STSong']plt.rcParams['axes.unicode_minus'] = False# 设置标题和网格plt.title('北京 2018 年每日平均温度、风速和风向')ax1.grid(visible=True)
plt.show()



【END】

以上仅是下载了数据,可以看到其中有很多的空值与异常值,后续数据的处理工作还未进行,希望对大家有用,多多指教。


全部代码:




    
from meteostat import Stations, Point, Dailyimport matplotlib.pyplot as pltfrom datetime import datetime
# 查找北京附近的气象站stations = Stations()stations = stations.region('CN') # 'CN' 是中国的 ISO 3166 国家代码stations = stations.nearby(39.9042, 116.4074) # 北京市的坐标station_list = stations.fetch(10)
# 打印找到的前10个气象站信息print(station_list)
# 选择第一个气象站的 IDstation_id = station_list.index[0]
# 下载该气象站的每日数据data = Daily(station_id, start = datetime(2018, 1, 1), end = datetime(2018, 12, 31))data = data.fetch()data.to_csv('2.csv')
# 绘制温度图plt.figure(figsize=(8, 6))plt.plot(data.index, data['tavg'], label='平均温度', color='blue')plt.plot(data.index, data['tmin'], label='最低温度', color='green')plt.plot(data.index, data['tmax'], label='最高温度', color='red')
plt.xlabel('日期')plt.ylabel('温度 (°C)')plt.legend()plt.grid()plt.title('北京 2023 年 1 月每日温度')plt.rcParams['font.sans-serif'] = ['STSong']plt.rcParams['axes.unicode_minus'] = Falseplt.show()


参考:

https://dev.meteostat.net/python/stations.html#data-structure

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/170294