用Python批处理指定数据-以WRF输出结果为例演示按照指定维度合并(附示例代码)

使用过WRF的人都知道,它的模拟结果是按照我们指定的时间间隔和模拟时间段依次输出的。但在处理数据的时候呢,比如想画一个时间趋势图之类的时候,挨个读取数据非常繁琐。我们希望能够把所有的数据或者某个我们关心的变量单独提取出来,让其按照指定的维度,如时间维度来排序并整合成一个文件。下面我就分享一下我在日常科研中为了解决这个问题而写的代码,供大家参考使用(代码很简单, 大家只需要把文件名、路径改成自己的就可以用了)。

因为一般WRF 默认输出文件的文件名后缀没有.nc,无法直接使用xarray进行读取,也就用不了concat函数。所以这里我们先给所有的输出文件批量添加后缀名".nc"。

#导入库
import numpy as np
import xarray as xr
import os  
from netCDF4 import Dataset

#选择 notebook 所在文件夹(也可自行指定文件路径)
path = os.getcwd()

#一般 WRF 默认输出文件的文件名后缀没有.nc,无法直接使用xarray进行读取,进而用不了concat函数
#这里我们批量修改文件名,加上后缀.nc
file_names = os.listdir(path)
for file in file_names:
    if file[0:10] != 'wrfout_d01':
        continue
    base_name = os.path.basename(file)
    new_n = base_name + '.nc'
    os.rename(os.path.join(path, file), os.path.join(path, new_n))

#选取path文件路径下所有前缀名为wrfout_d01的nc文件
list_names = []
for ncfile in os.listdir(path):
    if ncfile[0:10] != 'wrfout_d01':    #通过索引选择想要的数据,可以按照需要进行更改
        continue
    list_names.append(ncfile)

#将模拟结果文件名按照时间进行排序
list_names_sort = np.sort(list_names)

到这里,输出结果如下(未截图完全):

下面分别展示选择单个变量进行合并以及将所有变量按照指定维度进行合并。这里用了concat函数,具体大家可以见从xarray走向netCDF处理(四):合并与计算进行了解。

一、以单个变量P为例(可按需更改),按照时间顺序进行合并

#以单个变量P为例(可按需更改),按照时间顺序进行合并
file_list = []
for i in list_names_sort:
    print(i)
    ds = xr.open_dataset(i)
    file_list.append(ds['P'])

data = xr.concat(file_list, "Time")
data.to_netcdf('wrf_data.nc')

结果如下:

二、将所有变量,按照时间顺序进行合并 (顺便介绍一下如何计算气压并保存输出)

#将所有变量,按照时间顺序进行合并

file_list = []
for i in list_names_sort:
    print(i)
    ds = xr.open_dataset(i)
    file_list.append(ds)

data = xr.concat(file_list, "Time")
#顺便介绍一下如何计算气压并保存输出
data['pressure'] = (('Time','bottom_top','south_north','west_east'),np.zeros_like(data['P'])*np.NAN)
for i in range(len(data.Time)):
    data['pressure'][i] = data['P'][i]+data['PB'][i]
data['pressure'].attrs['FieldType']='104'
data['pressure'].attrs['MemoryOrder']='XYZ'
data['pressure'].attrs['description']='PRESSURE'data['pressure'].attrs['units']='Pa'
data['pressure'].attrs['stagger']=' '
data.to_netcdf('wrf_data.nc')

结果如下(以四个时刻为例):

到这里呢,就已经实现我们想要的效果啦。后面的数据处理,无论是求平均还是计算趋势,按照个人需求来好了。

版权声明:
作者:自学气象人
链接:https://jkboy.com/archives/10414.html
来源:随风的博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
用Python批处理指定数据-以WRF输出结果为例演示按照指定维度合并(附示例代码)
使用过WRF的人都知道,它的模拟结果是按照我们指定的时间间隔和模拟时间段依次输出的。但在处理数据的时候呢,比如想画一个时间趋势图之类的时候,挨个读取数据非常繁琐...
<<上一篇
下一篇>>