使用Python复制NetCDF文件

5
我想使用Python复制netcdf文件。有很好的例子可以读取或写入netcdf文件,但也许有一种好的方法可以将变量的输入和输出到另一个文件。为了以最低的成本获得维度和维度变量到输出文件,需要一个简单有效的方法。

我正在尝试使用netCDF4模块。 - msi_gerva
不,我的意思是你在尝试解决这个问题时做了什么?在发布这个问题之前,你做了哪些研究? - Corey Adler
我尝试在stackoverflow和网络上寻找解决方案。 - msi_gerva
那么你得到了什么结果?这里的人不会只为你做工作。你需要在问题中准确地展示你尝试过哪些代码或方法以使其工作。在寻求帮助之前,你需要向我们展示你已经尝试了所有可能的选项。 - Corey Adler
5个回答

8

我在python netcdf: making a copy of all variables and attributes but one找到了这个问题的答案,但是我需要改变它以适应我的版本的python/netCDF4(Python 2.7.6/1.0.4)。如果您需要添加或减去元素,则需要进行相应的修改。

import netCDF4 as nc

def create_file_from_source(src_file, trg_file):
    src = nc.Dataset(src_file)
    trg = nc.Dataset(trg_file, mode='w')

    # Create the dimensions of the file
    for name, dim in src.dimensions.items():
        trg.createDimension(name, len(dim) if not dim.isunlimited() else None)

    # Copy the global attributes
    trg.setncatts({a:src.getncattr(a) for a in src.ncattrs()})

    # Create the variables in the file
    for name, var in src.variables.items():
        trg.createVariable(name, var.dtype, var.dimensions)

        # Copy the variable attributes
        trg.variables[name].setncatts({a:var.getncattr(a) for a in var.ncattrs()})

        # Copy the variables values (as 'f4' eventually)
        trg.variables[name][:] = src.variables[name][:]

    # Save the file
    trg.close()

create_file_from_source('in.nc', 'out.nc')

这段代码已经过测试。


5
如果你想仅使用netCDF-4 API复制任何netCDF-4文件,即使其中包含使用任意用户定义类型的变量,这是一个困难的问题。目前,netcdf4-python.googlecode.com上的netCDF4模块不支持具有可变长度成员或具有基于复合类型的可变长度类型的复合类型。
nccopy实用程序可用于netCDF-4 C发行版,它展示了仅使用C netCDF-4 API就可以复制任意netCDF-4文件,但这是因为C API完全支持netCDF-4数据模型。如果将目标限制为仅复制使用googlecode模块支持的平面类型的netCDF-4文件,则在nccopy.c中使用的算法应该很好地工作,并且非常适合在Python中进行更优雅的实现。
一个更简单的、不那么雄心勃勃的项目是编写一个Python程序,它可以复制任何netCDF“classic format”文件,因为由netCDF-3支持的经典模型没有用户定义类型或递归类型。甚至对于使用性能功能(如压缩和分块)的netCDF-4 classic model文件,此程序也可以正常工作。

2
自从我发现了xarray,它就成为了我处理Python+netCDF相关事务的首选工具。
你可以很容易地复制一个netcdf文件,例如:
import xarray as xr

input = xr.open_dataset('ncfile.nc')
input.to_netcdf('copy_of_ncfile.nc')

1

-1

OP想要从一种格式的版本复制到另一种格式,这与文件的复制非常不同。更不用说OpenDAP了... - Eli S
2
@EliS,OP指定他需要一种简单的方法来复制(而不是压缩、分块、转换)一个netcdf 文件,而不是一个OpenDAP URL。其他所有内容都只是猜测。 - furins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接