前言:
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 安装:
在此示例中,将利用库的 Stations 类来创建一个图表,以可视化方式显示 BC 省温哥华 2018 年的每日气温。Daily为每日气象数据。
1.首先我们导入一些类和函数:
from datetime import datetime
import matplotlib.pyplot as plt
from meteostat import Stations, Daily
2.现在我们可以获取靠近我们兴趣点的气象站。只需将纬度和经度传递给该nearby方法即可:
stations = Stations(lat = 49.2497, lon = -123.1193, daily = datetime(2018, 1, 1))
station = stations.fetch(1)
3.接下来,指定一个daily参数。通过这样做,我们可以确保气象站确实提供了 2018 年的每日统计数据。调用后,fetch()变量station保存一个 Pandas DataFrame,其中包含有关我们选择的气象站的元信息。这个 DataFrame 可以传递给Daily类以访问实际的天气数据:
data = Daily(station, start = datetime(2018, 1, 1), end = datetime(2018, 12, 31))
data = data.fetch()
4.data现在是一个 Pandas DataFrame,每天包含一行(例外:时间序列可能包含间隙)。从现在开始,我们可以在 DataFrame 上使用 Pandas 方法,并绘制折线图可视化平均、最低和最高温度:
# Plot line chart including average, minimum and maximum temperature
data.plot(y = ['tavg', 'tmin', 'tmax'], kind = 'line')
# Show chart
plt.show()
3
Python 下载中国站点气象数据
通过以上示例我们已经知道了如何使用Meteostat Python 包,因为其中也包含了中国的气象站点,因此我们可以来尝试一下下载国内的气象数据,代码如下:
1.下载北京及附近区域站点每日气象数据
from meteostat import Stations, Point, Daily
import matplotlib.pyplot as plt
from datetime import datetime
stations = Stations()
stations = stations.region('CN')
stations = stations.nearby(39.9042, 116.4074)
station_list = stations.fetch(10)
print(station_list)
station_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, Hourly
import matplotlib.pyplot as plt
from datetime import datetime
stations = Stations()
stations = stations.region('CN')
stations = stations.nearby(39.9042, 116.4074)
station_list = stations.fetch(10)
print(station_list)
station_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, Daily
import matplotlib.pyplot as plt
from datetime import datetime
stations = Stations()
stations = stations.region('CN')
stations = stations.nearby(39.9042, 116.4074)
station_list = stations.fetch(10)
print(station_list)
station_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'] = False
plt.show()
参考: