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

时间:2016-02-09 00:40:51

标签: python numpy ascii netcdf

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

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

问题:     Traceback(最近一次调用最后一次):     文件“D:\ Work 1 \ FINAL \ New Try \ txt2nc.py”,第51行,in     vic_runoff [ra,spd,:,:] =输出;     在netCDF4.Variable中输入“netCDF4.pyx”,第2821行。 setitem     (netCDF4.c:35204)     文件“C:\ Python27 \ lib \ site-packages \ netCDF4_utils.py”,第187行,in     _StartCountStride     ee =范围(开始,停止,步骤)     文件“C:\ Python27 \ lib \ site-packages \ numpy \ ma \ core.py”,第4102行,     的 INT     raise 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')

1 个答案:

答案 0 :(得分:2)

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

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

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

的性能提升情况

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