社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

气象学家 • 6 月前 • 161 次点击  

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
 
161 次点击