如何从ERA5再分析数据中提取移动船舶对应时空点的气象变量?
ERA5移动船舶位置气象数据提取代码修改方案
实现思路
针对船舶每个时间步的经纬度,通过xarray插值功能从ERA5网格数据中提取对应时刻、对应位置的气象变量(风速、风向等),最终和船舶实测数据合并输出。
具体修改步骤
1. 读取并预处理船舶位置数据
先加载船舶的时间、经纬度数据,统一时间格式为UTC(ERA5默认用UTC时间):
import pandas as pd # 读取船舶数据(根据实际文件格式调整,这里假设是CSV) ship_df = pd.read_csv('ship_positions.csv', index_col='Date-Time', parse_dates=True) # 转换为UTC时区(如果原始数据是本地时间,需替换为对应时区,比如'America/Sao_Paulo') ship_df.index = ship_df.index.tz_localize('UTC')
2. 正确读取ERA5数据并对齐时间
修正原代码的时间解码问题,确保ERA5时间轴和船舶时间一致:
import xarray as xr # 读取ERA5数据,开启时间自动解码 era5_data = xr.open_dataset('C:/Users/William Jacondino/Desktop/Dados/ERA5/ERA5_2017.nc', decode_times=True) # 为ERA5时间添加UTC时区标记,避免时区不匹配 era5_data = era5_data.assign_coords(time=era5_data.time.tz_localize('UTC')) # 若ERA5经度是0-360格式,转换为船舶常用的-180-180格式 era5_data = era5_data.assign_coords(longitude=(era5_data.longitude + 180) % 360 - 180)
3. 按船舶轨迹插值提取气象变量
使用xarray的interp方法,对每个时间点的经纬度进行插值,提取目标变量:
# 指定需要提取的气象变量,比如u10(10米东向风速)、v10(10米北向风速) target_vars = ['u10', 'v10'] # 按船舶的时间、纬度、经度进行线性插值(可选method='nearest'用最近邻插值) era5_ship_data = era5_data[target_vars].interp( time=ship_df.index, latitude=ship_df['Latitude'], longitude=ship_df['Longitude'], method='linear' )
4. 合并数据并保存结果
将提取的ERA5数据转为DataFrame,和船舶实测数据合并后保存:
# 转换为DataFrame格式 era5_ship_df = era5_ship_data.to_dataframe() # 合并船舶实测数据(假设实测风字段为'WS_obs'、'WD_obs') final_result = pd.concat([ship_df, era5_ship_df], axis=1) # 保存到指定目录 dir_out = 'your/output/path' final_result.to_csv(f'{dir_out}/era5_ship_meteorology.csv') print(f"\n! 已成功保存所有时序数据到输出目录!!\n{dir_out}")
关键注意点
- 确保ERA5数据的时间范围完全覆盖船舶数据的时间区间,否则插值结果会出现NaN。
- 若船舶数据时间间隔和ERA5不一致(比如ERA5是6小时一次,船舶是1小时一次),
interp会自动完成时间维度的插值。 - 插值方法选择:线性插值适合风速、温度这类连续变量;最近邻插值适合像天气类型这类离散变量。
内容的提问来源于stack exchange,提问作者William Jacondino
相关产品推荐
相关产品推荐

