当前位置: 首页 > 知识库问答 >
问题:

合并大量netCDF文件

南门鸿畴
2023-03-14

我有一个很大的netCDF(.nc)文件文件夹,每个文件都有相似的名称。数据文件包含时间、经度、纬度和月降水量变量。目标是获得每个月X年的平均月降水量。因此,最终我会得到12个值,代表每个纬度和长纬度的X年平均月降水量。多年来,每个文件都位于同一位置。每个文件以相同的名称开头,以“date.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'

结尾是年月。目前为止我所知道的是:

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

我得到一个KeyError: ('time ','经度','纬度',' prectot ')。有没有一种方法可以把所有这些数据结合起来,让我能够操作它们?

共有3个答案

史骏祥
2023-03-14

ymonmean命令计算CDO日历月的平均值。因此,这项任务可以通过两条途径完成:

cdo mergetime data*.SUB.nc  merged.nc  # put files together into one series
cdo ymonmean merged.nc annual_cycle.nc # mean of all Jan,Feb etc. 

CDO还可以计算其他统计数据的年度周期,YMONSTD,YMONMAX等。时间单位可以是天或五角星以及月。(例如,Ydaymean)。

娄丁雨
2023-03-14

NCO通过以下方式完成此任务

ncra *.01.SUB.nc pcp_avg_01.nc
ncra *.02.SUB.nc pcp_avg_02.nc
...
ncra *.12.SUB.nc pcp_avg_12.nc
ncrcat pcp_avg_??.nc pcp_avg.nc

当然,前12个命令可以用Bash循环完成,将总行数减少到不到5行。如果您更喜欢使用python编写脚本,您可以使用此检查您的答案。ncra文档在这里。

西门梓
2023-03-14

正如@CharlieZender提到的,ncra是这里的方式,我将提供有关将该函数集成到Python脚本中的更多详细信息。(PS - 您可以使用自制软件轻松安装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]
 类似资料:
  • 我需要一些处理NetCDF文件的帮助。我总共有10个文件,分别用于10年。每年都有多个(相同的)变量,其中一些还涵盖每日值。在这里,我向您展示了一个结构示例: 我需要将数据作为模型的输入进行处理。我需要从10个NetCDF文件中提取的变量是SMB变量,它只是每个网格单元的年度值。所以我想构建一个如下形式的NetCDF: 我知道 ncks 命令已经只提取 SMB 变量,但我无法一次将其应用于多个文件

  • 我有很多海面温度NetCDF文件,具有相同的纬度和纬度,但时间变量不同。我想尝试通过组合时间变量将其组合成一个NetCDF文件,因为每个NetCDF文件中的时间变量是连续的 有没有更有效的方法?因为在CDO(气候数据操作员)中,我无法进行循环 下面是我使用的文件名的一个例子 带模式sstdas_(年)(月)(dekad)

  • 我试图从一个基于变量的netCDF文件中提取天气数据。的。nc文件包含14个变量和2个尺寸。我想提取与第一个变量a的值相关的14个变量的所有数据。数据来自荷兰计量研究所,可以在这里找到。 使用netCDF4模块在Python中加载数据,如下所示: 印刷变量和尺寸: 我想提取特定“站”的数据并将其放入熊猫数据帧中以执行一些计算。 我尝试了这样的东西来提取数据,但我知道这不是 netCDF 文件的工作

  • 本文向大家介绍python实现大文件分割与合并,包括了python实现大文件分割与合并的使用技巧和注意事项,需要的朋友参考一下 很多时候我们会面临大文件无法加载到内存,或者要传输大文件的问题。这时候就需要考虑将大文件分割为小文件进行处理了。 下面是一种用python分割与合并分件的实现。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: SO和Web上的大多数问题/答案都讨论了如何使用Hive将一堆小的ORC文件组合成一个更大的文件,但是,我的ORC文件是日志文件,每天都分开,因此我需要将它们分开。我只想每天“汇总” ORC文件(它们是HDFS中的目录)。 我最有可能需要用Java编写解决方案,并且遇到过OrcFileMergeOperator,这可能是我需要使用的内容,但还为时过早。 解决此问题的最佳方法是什么? 问

  • 我还需要在两个文件之间创建一个分页符,在新的组合rtf文件中。我访问了MS word,并能够将两个rtf文件组合在一起,但这只是创建了一个没有分页符的长rtf文件。 我有一个代码,但它只复制一个文件到另一个文件相同的方式,但我需要帮助调整这段代码,以便我可以复制两个文件到一个文件 如何在FileInputStream文件的顶部添加另一个FileInputStream对象,并在文件和对象之间设置分页