python|双三次线性插值—三维网格数据插值到站点_每个站点为一个csv-同时对多个要素插值-调用GPU进行加速计算
作者:第八星系-李智
邮箱:lizhi258147369@163.com
import pandas as pd
import numpy as np
import netCDF4 as nc
import torch
from torch import nn
from torch.nn import functional as F
from pathlib import Path
# 读取站点信息
stations_info = pd.read_excel(r'D:\ML\grid to stations\stations.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
# 读取网格数据
dataset = nc.Dataset(r"D:\ML\grid to stations\ERA5.3D.nc")
# 经纬度
longitude = dataset.variables['longitude'][:].data
latitude = dataset.variables['latitude'][:].data
# 温度数据:t2m,skt,stl1
t2m = dataset.variables['t2m'][:, :, :].data # 2米温度
skt = dataset.variables['skt'][:, :, :].data # 地表温度
stl1 = dataset.variables['stl1'][:, :, :].data # 土壤表面温度
# 将格点范围内的站点筛选出来
lonSta, latSta = stations_info['经度'].to_numpy(), stations_info['纬度'].to_numpy()
station_ids = stations_info['预报站点区站号'].to_numpy()
# 定义插值模型
class InterpolationModel(nn.Module):
def __init__(self):
super(InterpolationModel, self).__init__()
def forward(self, lon, lat, t_values):
t_values = t_values.unsqueeze(0).unsqueeze(0) # 添加两个维度,以匹配 interpolate 的预期输入
interpolated = F.interpolate(t_values, size=(1, 1), mode='bicubic', align_corners=False) # 使用双三次线性插值计算
return interpolated.squeeze()
# 创建插值模型实例
interpolation_model = InterpolationModel().cuda()
# 对每个站点进行插值计算并保存为单独的 CSV 文件
for i in range(len(lonSta)): # 遍历每个站点
t2m_nearest, skt_nearest, stl1_nearest = [], [], [] # 初始化列表,用于存储每个时间点的插值结果
for t_index in range(t2m.shape[0]): # 对每个时间点进行操作
t2m_values = torch.tensor(t2m[t_index, :, :], dtype=torch.float32).cuda() # 获取当前时间点的2米温度值,并转换为张量
skt_values = torch.tensor(skt[t_index, :, :], dtype=torch.float32).cuda() # 获取当前时间点的地表温度值,并转换为张量
stl1_values = torch.tensor(stl1[t_index, :, :], dtype=torch.float32).cuda() # 获取当前时间点的土壤表面温度值,并转换为张量
lon_tensor = torch.tensor(lonSta[i], dtype=torch.float32).cuda() # 将经度转换为张量
lat_tensor = torch.tensor(latSta[i], dtype=torch.float32).cuda() # 将纬度转换为张量
interpolated_t2m = interpolation_model(lon_tensor, lat_tensor, t2m_values) # 对2米温度进行插值计算
interpolated_skt = interpolation_model(lon_tensor, lat_tensor, skt_values) # 对地表温度进行插值计算
interpolated_stl1 = interpolation_model(lon_tensor, lat_tensor, stl1_values) # 对土壤表面温度进行插值计算
t2m_nearest.append(interpolated_t2m.item()) # 将2米温度插值结果添加到列表中
skt_nearest.append(interpolated_skt.item()) # 将地表温度插值结果添加到列表中
stl1_nearest.append(interpolated_stl1.item()) # 将土壤表面温度插值结果添加到列表中
# 创建单独的 DataFrame 保存插值结果
data = {'t2m': t2m_nearest, 'skt': skt_nearest, 'stl1': stl1_nearest}
t_sta_nearest_df = pd.DataFrame(data) # 创建 DataFrame,包含 t2m、skt、stl1 列
# 生成文件名,以对应的预报站点区站号命名
filename = f'D:/ML/grid to stations/stations_csv/station_{station_ids[i]}_3D.csv' # 生成 CSV 文件的路径和文件名
# 将插值数据保存为 CSV 文件
t_sta_nearest_df.to_csv(filename, index=False) # 将 DataFrame 中的数据保存为 CSV 文件,不保存索引列
print("CSV 文件生成完成!") # 输出提示信息,表示 CSV 文件生成完成
END
群内每日更新分享数据
进群回复 第八星系
本文编辑|小拾壹