2016-02-09 95 views
2

首先,我對這個論壇不熟悉,所以請原諒我在這裏發佈的任何錯誤。如果你能指出我的錯誤,我會很高興,當我發佈其他東西時,我會確保不再重複。使用Python將ASCII文件轉換爲netCDF(來自ASCII文件的選擇列)

任務:使用Python將ASCII數據文件(UCAC 4 Star Catalog)轉換爲netCDF格式。只能從ASCII文件輸出一些固定數量的列到netCDF文件。

問題: 回溯(最近通話最後一個): 文件 「d:\工作1 \ FINAL \新嘗試\ txt2nc.py」 51行,在 vic_runoff [RA,SPD,:,:] =輸出; netCDF4.Variable中的文件「netCDF4.pyx」,第2821行。 setitem (netCDF4.c:35204) 文件 「C:\ Python27 \ lib中\站點包\ netCDF4_utils.py」,線路187,在 _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') 

回答

2

幾點意見,希望能幫助您:

vic_runoff[ra,spd,:,:]spd是netCDF4變量。它不能用作索引器。試試vic_runoff[ra,0,:,:] = tempstore[:,:]看看是否可以解決你的問題。

此外,您應該考慮使用pandas.read_csvread_table來讀取您的ASCII文件。在這裏有一個SO帖子,記錄下性能改進numpy.loadtxt

最後,如果你去了熊貓路線,你可以考慮使用xarray來寫入netCDF。 xarray很容易讓你從熊貓轉換爲xarray.Dataset然後你是整個netCDF文件是用快速Dataset.to_netcdf()調用寫的。

+0

感謝您的幫助!我一定會嘗試一下讓你知道 –

+0

非常感謝!我嘗試過使用'pandas'和'xarray'並且現在正在工作,我將很快爲其他人發佈解決方案! –

相關問題