一、需求分析
熟悉ERA5数据,提取某一时次某一经纬度的温度、U风、V风,绘制垂直廓线。
二、数据准备
ERA5数据下载地址:
Copernicus Climate Data Store | Copernicus Climate Data Store
ERA5是 ECMWF 对过去 80 年全球气候和天气的第五代再分析。数据可从 1940 年开始提供。ERA5 取代了 ERA-Interim 再分析。
ERA5 提供大量大气、海浪和陆地表面量的每小时估计值。不确定性估计值由底层 10 成员集合以每三小时为间隔进行采样。
ERA5 每日更新,延迟时间约为 5 天。
数据已重新划分为 0.25 度的常规经纬度网格,用于重新分析,0.5 度用于不确定性估计(海浪分别为 0.5 度和 1 度)。有四个主要子集:每小时和每月产品,包括气压水平(高空场)和单一水平(大气、海浪和陆地表面量)。
主要变量见表MAIN VARIABLES。
作者下载的参数如下图:
三、程序设计
import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
# 加载ERA5数据
file_path = 'D:/test/202405.nc' # 替换为你的ERA5数据文件路径
dataset = xr.open_dataset(file_path)
# 筛选时间点
timestamp = np.datetime64('2024-05-03T14:00:00')
dataset_time_filtered = dataset.sel(time=timestamp, method='nearest')
# 筛选地点
latitude1, longitude1 = 31.8667, 117.2833 # 北纬31度52分、东经117度17分
latitude2, longitude2 = 31.0, 117.3 # 北纬31度、东经117.3度
# 提取两个地点的温度廓线、U-component of wind和V-component of wind
temperature_profile1 = dataset_time_filtered.sel(latitude=latitude1, longitude=longitude1, method='nearest').t
temperature_profile2 = dataset_time_filtered.sel(latitude=latitude2, longitude=longitude2, method='nearest').t
u_wind_profile1 = dataset_time_filtered.sel(latitude=latitude1, longitude=longitude1, method='nearest').u
u_wind_profile2 = dataset_time_filtered.sel(latitude=latitude2, longitude=longitude2, method='nearest').u
v_wind_profile1 = dataset_time_filtered.sel(latitude=latitude1, longitude=longitude1, method='nearest').v
v_wind_profile2 = dataset_time_filtered.sel(latitude=latitude2, longitude=longitude2, method='nearest').v
# 创建一个图表和两个子图
fig, (plt1, plt2) = plt.subplots(1, 2, figsize=(14, 6))
# 温度廓线
temperature_profile1.plot(y='level', marker='o', label=f'Temperature 31.8667N, 117.2833E', ax=plt1)
temperature_profile2.plot(y='level', marker='x', label=f'Temperature 31.0N, 117.3E', ax=plt1)
plt1.set_title('Temperature Profiles')
plt1.set_xlabel('Temperature (K)')
plt1.set_ylabel('Pressure Level (hPa)')
plt1.invert_yaxis() # 压力随高度增加而减小,因此反转y轴
plt1.legend()
plt1.grid(True)
# U和V风分量
# 注意:风速可能需要转换为其他单位,这里假设单位是m/s
u_wind_profile1.plot(y='level', marker='o', linestyle='--', label=f'U-wind 31.8667N, 117.2833E', ax=plt2)
u_wind_profile2.plot(y='level', marker='x', linestyle='--', label=f'U-wind 31.0N, 117.3E', ax=plt2)
v_wind_profile1.plot(y='level', marker='o', linestyle='-.', label=f'V-wind 31.8667N, 117.2833E', ax=plt2)
v_wind_profile2.plot(y='level', marker='x', linestyle='-.', label=f'V-wind 31.0N, 117.3E', ax=plt2)
plt2.set_title('Wind Components')
plt2.set_xlabel('Wind Speed (m/s)')
plt2.set_ylabel('Pressure Level (hPa)')
plt2.invert_yaxis() # 压力随高度增加而减小,因此反转y轴
plt2.legend()
plt2.grid(True)
# 调整布局并显示图表
plt.tight_layout()
plt.show()
四、结果
五、下一步思考
5.1 UV分量转换成风速和风向
5.2 生成日、月等数据,分析特征
5.3 看相关文献整理思路