2014-12-07 5 views
0

Привет Я хочу изменить информацию в файле NetCDF, чтобы дать пример предположим, что у вас есть ncdump файла со следующей информацией:Изменить имя измерения в NetCDF файл с питона

NetCDF dimension information: 
Name: lon 
    size: 144 
    type: dtype('float64') 
Name: lat 
    size: 73 
    type: dtype('float64') 
Name: time 
    size: 29220 
    type: dtype('float64') 
NetCDF variable information: 
Name: rlut 
    dimensions: (u'time', u'lat', u'lon') 
    type: dtype('float32') 

Я хочу изменить 'lon' для 'longitude'. Я попытался с:

from netCDF4 import Dataset 
path="Here goes the file path" 
f=Dataset(path,'r+') 
f.renameDimension(u'lon',u'longitude') 
f.close() 

Но после этого, когда я попытался прочитать файл снова делать что-то другое файл не работает больше.

Любая помощь, которую я вам благодарю.

+0

Можете ли вы уточнить, что вы подразумеваете под словом «читать файл снова для выполнения чего-то другого»? Это использование другого программного обеспечения? Такое поведение, как ожидается, будет работать так же, как вы пытались, и если это не так, это ошибка. См. Модульный тест здесь: https://code.google.com/p/netcdf4-python/source/browse/trunk/test/tst_rename.py?r=1146 (Кроме того, он просто отлично работает для меня с ncdump, когда я просто попробовал это) – DopplerShift

+0

Когда я говорю «снова прочитайте файл для выполнения чего-то другого», я имею в виду, что файл после этой процедуры поврежден, поэтому с файлом невозможно выполнить какие-либо действия. – AJaramillo

+0

Тогда я бы открыл вопрос по адресу: https://github.com/unidata/netcdf4-python/issues, и если бы вы могли, разместите файл данных где-нибудь, потому что он должен работать так же, как вы пробовали, и работал для меня здесь. – DopplerShift

ответ

1

Если вам не нужно использовать Python, я бы рекомендовал ncrename функцию сержантов: http://nco.sourceforge.net/nco.html#ncrename-netCDF-Renamer

ncrename -d lon,longitude sample_file.nc 
+0

Я пробовал эту опцию, но когда я читаю файл после этого, я получаю сообщение об ошибке «RuntimeError: NetCDF: недопустимый идентификатор или имя измерения» – AJaramillo

+0

Странно, есть ли способ поделиться файлом netcdf? – N1B4

+0

Я решил проблему создания нового файла NetCDF, импортирующего свойства из старого. Спасибо – AJaramillo

1

Я думаю, вы также должны изменить любые ссылки на переименованный измерение. Например. ваша переменная, rlut, которая имеет размерность «lon», которая была переименована в «долготу». Не уверен, что это можно сделать путем редактирования на месте. Вы, возможно, потребуется создать новую копию файла с помощью:

createVariable('rlut', 'f4', ('time', 'lat', 'longitude') 
+0

Я тоже пробовал эту опцию, но получаю сообщение об ошибке при использовании файла. Я думаю, что это проблема конкретного файла netcdf, который я использую. – AJaramillo

1

Спасибо N1B4 за предложение использовать NCO, это очень хороший вариант для работы и редактирования NetCDF файлов.

Я хочу опубликовать здесь эскиз моего решения для тех, которые могут быть заинтересованы в изменении файла NetCDF с использованием python с использованием библиотеки netcdf4. Идея состоит в том, чтобы создать новый файл NetCDF, импортирующий информацию из существующего файла.

#First import the netcdf4 library 
from netCDF4 import Dataset # http://code.google.com/p/netcdf4-python/ 

# Read en existing NetCDF file and create a new one 
# f is going to be the existing NetCDF file from where we want to import data 
# and g is going to be the new file. 

f=Dataset('pathtoexistingfile','r') # r is for read only 
g=Dataset('name of the new file','w') # w if for creating a file 
             # if the file exists it the 
             # file will be deleted to write on it 


# To copy the global attributes of the netCDF file 

for attname in f.ncattrs(): 
    setattr(g,attname,getattr(f,attname)) 

# To copy the dimension of the netCDF file 

for dimname,dim in f.dimensions.iteritems(): 
     # if you want to make changes in the dimensions of the new file 
     # you should add your own conditions here before the creation of the dimension. 
     g.createDimension(dimname,len(dim)) 


# To copy the variables of the netCDF file 

for varname,ncvar in f.variables.iteritems(): 
     # if you want to make changes in the variables of the new file 
     # you should add your own conditions here before the creation of the variable. 
     var = g.createVariable(varname,ncvar.dtype,ncvar.dimensions) 
     #Proceed to copy the variable attributes 
     for attname in ncvar.ncattrs(): 
      setattr(var,attname,getattr(ncvar,attname)) 
     #Finally copy the variable data to the new created variable 
     var[:] = ncvar[:] 


f.close() 
g.close() 

Я надеюсь, что это может сработать для вас.

Смежные вопросы