Как обновить существующий массив netCDF в python
У меня есть код, как показано ниже, я хочу обновить существующий файл NetCDF в соответствии с другим файлом NetCDF. Если в другом файле NetCDF value=0
в месте существующего файла NetCDF он равен 0. Поэтому я рассматриваю только место, где другой netcdf не равен 0
import netCDF4 as net
days=["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"]
months=["02","03","04","05","06","07"]
for month in months:
for day in days:
try:
infile=net.Dataset("2015%s%s-160000_0.nc" % (month,day),"w")
value=infile.variables['HailProb'][:]
value1=infile1.variables['hailsie'][:]
infile[value==0 or value1==0]==0
infile.close()
except RuntimeError:
continue
Потому что, если я открою infile
Я беспокоюсь, что в режиме записи все существующие данные будут перезаписаны. Может кто-нибудь взглянуть на то, как я решаю проблему здесь? Что не так с кодом?
2 ответа
Откройте файл в режиме добавления с помощью a
:
infile=net.Dataset("2015%s%s-160000_0.nc" % (month,day), "a")
Теперь вы можете читать и писать в существующий файл, как говорят документы:
a
а такжеr+
означает добавление (по аналогии с серийными файлами); существующий файл открывается для чтения и записи.
Я считаю, что с вашим кодом была пара проблем.
Чтобы изменить существующий файл, я думаю, вы должны прочитать его в
r+
(или, как упоминал Майк Мюллер, вa
) Режим.С
infile[value==0 or value1==0]==0
,infile
это не ваш массив данных, ноnetCDF4
объект. Чтобы изменить переменную, вам нужно что-то вродеinfile.variables["HailProb"]...
С
infile[..]==0
,==
тесты на равенство, он не устанавливает новое значение вinfile
(использование=
для этого, еслиinfile
был на самом деле массив)Ваша линия с
value==0 or value1==0
не сработает; тебе нужно что-то вроде(value==0) | (value1==0)
нарезать массив.
Я думаю, что-то вроде этого должно работать:
import netCDF4 as net
days=["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"]
months=["02","03","04","05","06","07"]
for month in months:
for day in days:
try:
infile = net.Dataset("2015%s%s-160000_0.nc" % (month,day), "r+")
value = infile.variables['HailProb'][:]
value1 = infile1.variables['hailsie'][:]
infile.variables['HailProb'][(value==0) | (value1==0)] = 0
infile.close()
except RuntimeError:
continue
Более полный рабочий пример, который также создает файлы NetCDF для воспроизведения:
import netCDF4 as nc4
import numpy as np
# Create NetCDF file 1
nc1 = nc4.Dataset('nc1.nc', 'w')
nc1.createDimension('z', 10)
nc_var = nc1.createVariable('HailProb', 'f8', 'z')
# Add some dummy data, and set a single value to zero:
nc_var[:] = np.random.randint(2, 10, size=10)
nc_var[5] = 0
nc1.close()
# Create NetCDF file 2
nc2 = nc4.Dataset('nc2.nc', 'w')
nc2.createDimension('z', 10)
nc_var = nc2.createVariable('hailsie', 'f8', 'z')
# Add some dummy data, and set a single value to zero:
nc_var[:] = np.random.randint(2, 10, size=10)
nc_var[3] = 0
nc2.close()
# Read files back
# File 1 in in "r+" mode, since we want to edit it
nc1 = nc4.Dataset('nc1.nc', 'r+')
value = nc1.variables["HailProb"][:]
# File 2 only required "r" (read) mode
nc2 = nc4.Dataset('nc2.nc', 'r')
value1 = nc2.variables["hailsie"][:]
# Update NetCDF file based on some conditions
nc1.variables["HailProb"][(value==0) | (value1==0)] = 0
nc1.close()
nc2.close()
После запуска первой части кода (создание nc1.nc
а также nc2.nc
), ncdump -v HailProp nc1.nc
а также ncdump -v hailcie nc2.nc
дает мне:
HailProb = 2, 9, 6, 6, 9, 0, 5, 4, 8, 6 ;
hailsie = 4, 6, 2, 0, 4, 3, 6, 4, 5, 7 ;
После запуска второй части кода я получаю:
HailProb = 5, 6, 8, 0, 7, 0, 6, 4, 2, 4 ;