使用 Python 将 ASCII 文件转换为 netCDF(ASCII 文件中的选择性列)



首先,我是这个论坛的新手,所以请原谅我在这里发帖时犯的任何错误。如果您能指出我的错误,我会很高兴,我会确保在发布任何其他内容时不会重复它们。

任务:使用 Python 将 ASCII 数据文件(UCAC 4 星目录(转换为 netCDF 格式。仅将一些固定数量的列从 ASCII 文件输出到 netCDF 文件。

问题: 回溯(最近一次调用(: 文件 "D:\Work 1\FINAL\New Try\txt2nc.py",第 51 行,在 vic_runoff[ra,spd,:,:] = 输出; 文件 "netCDF4.pyx",第 2821 行,在 netCDF4.Variable 中。设置项 (netCDF4.c:35204( 文件 "C:\Python27\lib\site-packagesetCDF4_utils.py",第 187 行,在 _StartCountStride ee = 范围(开始、停止、步长( 文件 "C:\Python27\lib\site-packagesumpy\ma\core.py",第 4102 行,在 国际 引发 MaskError('无法将掩码元素转换为 Python int'( MaskError: 无法将掩码元素转换为 Python int。

提前谢谢。任何帮助不胜感激!

    from __future__ import division
    from netCDF4 import Dataset
    import numpy as np
    import os
    PATH = 'D:\Internship Work 1\Alok Data\ASCII'
    LL = np.loadtxt('%s\4uc001.txt' %PATH, delimiter='|', usecols = 
     (0,1,2,3), skiprows=0);
    LL = LL[:,:]
    # NC file setup
    root_grp = Dataset('%s\4uc001.nc' %PATH, 'w', format='NETCDF4')
    root_grp.description = 'Star Catalog UCAC Data'
    # dimensions
    ra = root_grp.createDimension('ra', 32)
    spd = root_grp.createDimension('spd', 80)
    magm = root_grp.createDimension('magm', 96)
    maga = root_grp.createDimension('maga', 120)

    # variables
    ra = root_grp.createVariable('ra', np.byte, ('ra',))
    spd = root_grp.createVariable('spd', np.byte, ('spd',))
    magm = root_grp.createVariable('magm', np.byte, ('magm'),)
    maga = root_grp.createVariable('maga', np.byte, ('maga'),)
    vic_runoff = root_grp.createVariable('vic_runoff', np.byte, ('ra',
     'spd', 'magm', 'maga',))
    ra.units = 'mas'
    spd.units = 'mas'
    magm.units = 'millimag'
    maga.units = 'millimag'
    for ra in enumerate(ra):
      tempstore = np.zeros((206,4),int)

    output_filename = 'D:\Internship Work 1\Alok Data\ASCII\4uc001.txt'
    output = np.loadtxt(output_filename,delimiter='|',usecols = (0,1,2,3))
    tempstore[:,:] = output # ensembles x months
    vic_runoff[ra,spd,:,:] = tempstore[:,:] # write all ensembles to netcdf
    print('work done')

一些评论希望对您有所帮助:

vic_runoff[ra,spd,:,:]中,spd是一个netCDF4变量。 它不能用作索引器。尝试vic_runoff[ra,0,:,:] = tempstore[:,:]看看是否可以解决您的问题。

此外,您应该考虑使用 pandas.read_csvread_table 来读取 ASCII 文件。这里有一个SO帖子记录了numpy.loadtxt的性能改进

最后,如果你走熊猫路线,你可以考虑使用xarray写入netCDF。 xarray轻松地允许您从熊猫转换为xarray.Dataset然后您通过快速Dataset.to_netcdf()调用编写整个netCDF文件。

最新更新