python - 合并大量 netCDF 文件

标签 python netcdf cdo-climate

我有一个很大的 netCDF (.nc) 文件文件夹,每个文件的名称都相似。数据文件包含时间、经度、纬度和月降水量变量。目标是获得 X 年中每个月的平均月降水量。所以最后我会有 12 个值代表每个纬度和经度 X 年的平均月降水量。多年来,每个文件都位于同一位置。 每个文件都以相同的名称开头并以“date.sub.nc”结尾,例如:

'data1.somthing.somthing1.avg_2d_Ind_Nx.200109.SUB.nc'
'data1.somthing.somthing1.avg_2d_Ind_Nx.200509.SUB.nc'
'data2.somthing.somthing1.avg_2d_Ind_Nx.201104.SUB.nc'
'data2.somthing.somthing1.avg_2d_Ind_Nx.201004.SUB.nc'
'data2.somthing.somthing1.avg_2d_Ind_Nx.201003.SUB.nc'
'data2.somthing.somthing1.avg_2d_Ind_Nx.201103.SUB.nc'
'data1.somthing.somthing1.avg_2d_Ind_Nx.201203.SUB.nc'

结尾是YearMonth.SUB.nc 到目前为止我所拥有的是:

array=[]
f = nc.MFDataset('data*.nc')
precp = f.variables['prectot']
time = f.variables['time']
array = f.variables['time','longitude','latitude','prectot'] 

我得到一个 KeyError: ('time', 'longitude', 'latitude', 'prectot')。有没有一种方法可以组合所有这些数据以便我能够对其进行操作?

最佳答案

正如@CharlieZender 所提到的,ncra 是实现此目的的方法,我将提供更多关于将该函数集成到 Python 脚本中的详细信息。 (PS - 您可以使用 Homebrew 轻松安装 NCO,例如 http://alejandrosoto.net/blog/2014/01/22/setting-up-my-mac-for-scientific-research/ )

import subprocess
import netCDF4
import glob
import numpy as np

for month in range(1,13):
    # Gather all the files for this month
    month_files = glob.glob('/path/to/files/*{0:0>2d}.SUB.nc'.format(month))


    # Using NCO functions ---------------
    avg_file = './precip_avg_{0:0>2d}.nc'.format(month)

    # Concatenate the files using ncrcat
    subprocess.call(['ncrcat'] + month_files + ['-O', avg_file])

    # Take the time (record) average using ncra 
    subprocess.call(['ncra', avg_file, '-O', avg_file])

    # Read in the monthly precip climatology file and do whatever now
    ncfile = netCDF4.Dataset(avg_file, 'r')
    pr = ncfile.variables['prectot'][:,:,:]
    ....

    # Using only Python -------------
    # Initialize an array to store monthly-mean precip for all years
    # let's presume we know the lat and lon dimensions (nlat, nlon)
    nyears = len(month_files)
    pr_arr = np.zeros([nyears,nlat,nlon], dtype='f4')

    # Populate pr_arr with each file's monthly-mean precip
    for idx, filename in enumerate(month_files):
        ncfile = netCDF4.Dataset(filename, 'r')
        pr = ncfile.variable['prectot'][:,:,:]  
        pr_arr[idx,:,:] = np.mean(pr, axis=0)
        ncfile.close()

    # Take the average along all years for a monthly climatology
    pr_clim = np.mean(pr_arr, axis=0)  # 2D now [lat,lon]

关于python - 合并大量 netCDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28953219/

相关文章:

python - 在 python shell 上制作一个闪烁的忙碌指示器

python - PyCharm 和调试私有(private)属性

python - 使用 scipy 从 nc 文件中提取数据

bash - 在 NCO 中追加/合并数千个 (42000) 个 netCDF 文件的更快方法

netcdf - 无法使用 nco 附加两个 netcdf 文件

python - 在 netcdf 文件中将时间轴单位从 "years since"更改为 "days since"

python - 对 DataFrame 内存进行排序是否高效?

python - celery 中重复的任务

python - 如何使用 groupby 为 xarray 数据集添加新变量并应用?

csv - 使用 CDO 将 netCDF 转换为 CSV 文件时出现问题