Как обновить существующий массив 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+ означает добавление (по аналогии с серийными файлами); существующий файл открывается для чтения и записи.

Я считаю, что с вашим кодом была пара проблем.

  1. Чтобы изменить существующий файл, я думаю, вы должны прочитать его в r+ (или, как упоминал Майк Мюллер, в a) Режим.

  2. С infile[value==0 or value1==0]==0, infile это не ваш массив данных, но netCDF4 объект. Чтобы изменить переменную, вам нужно что-то вроде infile.variables["HailProb"]...

  3. С infile[..]==0, == тесты на равенство, он не устанавливает новое значение в infile (использование = для этого, если infile был на самом деле массив)

  4. Ваша линия с 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 ;
Другие вопросы по тегам