前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Python批处理指定数据-以WRF输出结果为例演示按照指定维度合并(附示例代码)

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

作者头像
自学气象人
发布2022-10-09 09:56:17
2.3K0
发布2022-10-09 09:56:17
举报
文章被收录于专栏:自学气象人

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

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

代码语言:javascript
复制
#导入库
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为例(可按需更改),按照时间顺序进行合并

代码语言:javascript
复制
#以单个变量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')

结果如下:

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

代码语言:javascript
复制
#将所有变量,按照时间顺序进行合并

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')

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档