Python - 从WRF输出文件中提取变量(如经向风、比湿和温度),进行插值处理,并将结果保存到一个NetCDF文件

该代码的作用是从WRF输出文件中提取变量(如经向风、比湿和温度),进行插值处理,并将结果保存到一个NetCDF文件中。

  1. 将重复的代码抽取到单独的函数中,以提高代码的重用性和可读性。
  2. 统一了变量命名风格,使用了下划线命名法。
  3. 添加了对文件的打开和关闭,以及错误处理机制。
  4. 添加了详细的文档字符串,描述了每个函数的作用、参数和返回值。
  5. 使用了 main() 函数来组织主要的执行逻辑。
import xarray as xr
import numpy as np
import pandas as pd
import glob 
import os  
from netCDF4 import Dataset
from wrf import getvar, interplevel, latlon_coords
from metpy.units import units
import metpy.calc as mpcalc

def open_dataset(path):
    """
    Open a WRF output dataset.

    Args:
    path (str): Path to WRF output file.

    Returns:
    xr.Dataset: WRF output dataset.
    """
    return Dataset(path)

def extract_variables(ncfile):
    """
    Extract variables from WRF output dataset.

    Args:
    ncfile (xr.Dataset): WRF output dataset.

    Returns:
    tuple: Tuple containing time stamp, v-wind component, specific humidity, and temperature.
    """
    time = str(getvar(ncfile, "times").data)[:19]
    p = getvar(ncfile, "pressure")
    ua = getvar(ncfile, "ua", units="m s-1")
    va = getvar(ncfile, "va", units="m s-1")
    sh = mpcalc.specific_humidity_from_mixing_ratio(getvar(ncfile, 'QVAPOR'))
    tem = getvar(ncfile, 'temp')
    
    return time, ua, va, sh, tem,p

def interpolate_variables(ua, va, sh, tem,p):
    """
    Interpolate variables.

    Args:
    time (str): Time stamp.
    ua (xr.DataArray): U-wind component.
    va (xr.DataArray): V-wind component.
    sh (xr.DataArray): Specific humidity.
    tem (xr.DataArray): Temperature.

    Returns:
    tuple: Tuple containing interpolated v-wind component, specific humidity, and temperature.
    """
    lats, lons = latlon_coords(ua)
    lon = lons.data
    lon[lon < 0] += 360
    level = np.array([100,125,150,175,200,225,250,300,350,400,450,500,550,600,650,700,750,
                      775,800,825,850,875,900,925,950,975,1000])
    plevs = level[::-1]
    
    v_interp = interplevel(va, p, plevs)
    sh_interp = interplevel(sh, p, plevs)
    tem_interp = interplevel(tem, p, plevs)
    
    return  v_interp.data, sh_interp.data, tem_interp.data

def save_netcdf(save_nc_path, time_list, v_list, sh_list, temp_list, lat, lon):
    """
    Save variables to a NetCDF file.

    Args:
    save_nc_path (str): Path to save the NetCDF file.
    time_list (list): List of time stamps.
    v_list (list): List of v-wind component arrays.
    sh_list (list): List of specific humidity arrays.
    temp_list (list): List of temperature arrays.
    lat (xr.DataArray): Latitude coordinates.
    lon (xr.DataArray): Longitude coordinates.
    """
    da_nc = xr.Dataset(
        data_vars=dict(
            v = (['time', 'level', 'lat', 'lon'], v_list),
            sh = (['time', 'level', 'lat', 'lon'], sh_list),
            tem = (['time', 'level', 'lat', 'lon'], temp_list),            
        ),      
        coords={
            'time': time_list, 
            'level': np.flip(np.array([100,125,150,175,200,225,250,300,350,400,450,500,550,600,
                                        650,700,750,775,800,825,850,875,900,925,950,975,1000])),
            'lat': lat.data,
            'lon': lon.data,
        },
        attrs=dict(
            description="destaggered v-wind component, temperature, and water vapor",
            units='m/s, K, gram/kilogram',
        ),
    )
    da_nc.to_netcdf(save_nc_path)
    print('NetCDF has been output')
def  cal_dxdy(file):
    ncfile = Dataset(file)
    P = getvar(ncfile, "pressure")
    lats, lons = latlon_coords(P)
    lon = lons[0]
    lon[lon<=0]=lon[lon<=0]+360
    lat = lats[:,0]
    dx, dy = mpcalc.lat_lon_grid_deltas(lon.data, lat.data)
    return lon,lat,dx,dy

def main():
    case = 'case22'
    data_path = f'/WRFV3/test/em_real/output_experiment/{case}'
    save_nc_path = f'/WRFV3/test/em_real/v_sh_temp_{case}.nc'
    files = sorted(glob.glob(os.path.join(data_path, 'wrfout*'))) 
	
    time_list, v_list, sh_list, temp_list = [], [], [], []
	lon,lat,_,_ = cal_dxdy(files[0])
    for file in files:
        print(file)
        ncfile = open_dataset(file)
        time, ua, va, sh, tem,p = extract_variables(ncfile)

        v_interp, sh_interp, tem_interp = interpolate_variables(ua, va, sh, tem,p)
        time_list.append(pd.to_datetime(time))
        v_list.append(v_interp)
        sh_list.append(sh_interp)
        temp_list.append(tem_interp)

    save_netcdf(save_nc_path, time_list, v_list, sh_list, temp_list, lat, lon)

if __name__ == "__main__":
    main()

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在Python下载wrf-python库,可以按照以下步骤进行操作: 1. 首先,确保你的Python环境已经安装了ssh与sftp的库,例如paramiko库。 2. 创建一个SSH连接,连接到服务器。 3. 找到wrf-python库的资源全名,例如wrf-python-1.1.3.tar.gz。 4. 使用SFTP从服务器上下载这个资源文件至本地。你可以使用sftp.get() 方法来实现,其一个参数是服务器上的文件路径,第二个参数是本地存储路径。 5. 下载完成后,关闭连接。 请注意,为了确保文件名的有效性,需要注意Windows操作系统的敏感字符问题。如果文件包含Windows敏感字符,例如冒号(:),需要使用replace()方法将其替换为有效字符。比如将':'替换为'_'。 以下是一个示例代码,演示了如何使用Python批量下载wrf-python资源: ```python import os import paramiko # 创建SSH连接 ssh = paramiko.SSHClient() ssh.connect('服务器地址', username='用户名', password='密码') # 远程和本地的目录路径 remote_dir = '服务器上wrf-python资源的路径' local_dir = '本地存储路径' # 获取服务器目录下的所有文件 sftp = ssh.open_sftp() files = sftp.listdir(remote_dir) # 批量下载wrf-python资源 for f in files: print('Beginning to download file', f) print('Downloading file:', f + '.nc') # 替换文件的敏感字符 f1 = f.replace(':', '_') # 下载文件 sftp.get(os.path.join(remote_dir, f), os.path.join(local_dir, f1 + '.nc')) print('Download file success:', f) print('#################################') # 关闭连接 sftp.close() ssh.close() ``` 请根据你的实际情况修改代码的服务器地址,用户名,密码,服务器上wrf-python资源的路径以及本地存储路径。这样,你就可以使用Python下载wrf-python库了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简朴-ocean

继续进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值