python|双三次线性插值—三维网格数据插值到站点_每个站点为一个csv-同时对多个要素插值-调用GPU进行加速计算

文摘   2024-07-02 10:00   四川  


python|双三次线性插值—三维网格数据插值到站点_每个站点为一个csv-同时对多个要素插值-调用GPU进行加速计算

作者:第八星系-李智

邮箱:lizhi258147369@163.com


import pandas as pdimport numpy as npimport netCDF4 as ncimport torchfrom torch import nnfrom torch.nn import functional as Ffrom 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'][:].datalatitude = dataset.variables['latitude'][:].data
# 温度数据:t2m,skt,stl1t2m = 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

群内每日更新分享数据

进群回复 第八星系

本文编辑|小拾壹




第八星系人造大气理论爱好者
记录与交流python、matlab等科研工具。记录与交流大气科学的学科知识
 最新文章