社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

代码演示 | 用Python批处理指定数据-以WRF输出结果为例

happy科研 • 3 年前 • 984 次点击  

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


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

#导入库import numpy as npimport xarray as xrimport os  from netCDF4 import Dataset
#选择 notebook 所在文件夹(也可自行指定文件路径)path = os.getcwd()
#一般 WRF 默认输出文件的文件名后缀没有.nc,无法直接使用xarray进行读取,进而用不了concat函数#这里我们批量修改文件名,加上后缀.ncfile_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')


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



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


最后如果大家觉得文章比较好的话,希望能支持一下本公众号的公益活动,量力而行就好啦!



往期推荐

【公益】初衷

【公益】每周公示

CFL 错误、SIGSEGV 段错误以及挂起或停止

ProPlot3兰伯特投影-可添加刻度(三)

xarray库合集




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/124871
 
984 次点击