Python:使用netCDF4替换netcdf文件中的值
我有一个netcdf文件,其中有几个值<0。我想用一个值(比如-1)替换所有这些值。如何使用netCDF4实现这一点?我在文件中读到如下内容:Python:使用netCDF4替换netcdf文件中的值,python,netcdf,python-xarray,nco,Python,Netcdf,Python Xarray,Nco,我有一个netcdf文件,其中有几个值
import netCDF4
dset = netCDF4.Dataset('test.nc')
dset[dset.variables['var'] < 0] = -1
导入netCDF4
dset=netCDF4.Dataset('test.nc')
dset[dset.variables['var']<0]=-1
如果您想将数据保存在netCDF变量对象中,这应该可以:
import netCDF4
dset = netCDF4.Dataset('test.nc', 'r+')
dset['var'][:][dset['var'][:] < 0] = -1
dset.close() # if you want to write the variable back to disk
导入netCDF4
dset=netCDF4.Dataset('test.nc','r+'))
dset['var'][:][dset['var'][:]<0]=-1
dset.close()#如果要将变量写回磁盘
如果不想写回磁盘,请继续,只需获取numpy阵列并对其进行切片/分配:
data = dset['sea_ice_cover'][:] # data is a numpy array
data[data < 0] = -1
data=dset['sea_ice_cover'][:]#数据是一个numpy数组
数据[数据<0]=-1
对我来说,前面的答案不起作用,我用以下方法解决了它:
dset = netCDF4.Dataset('test.nc','r+')
dset.variables['var'][:]
... your changes ...
dset.close()
Soln 1:Python xarray 此解决方案使用xarray读取和写入netcdf文件,并使用包函数有条件地重置值
import xarray as xr
ds=xr.open_dataset('test.nc')
ds['var']=xr.where((ds['var']<0),-1,ds['var'])
ds.to_netcdf('modified_test.nc') # rewrite to netcdf
将xarray作为xr导入
ds=xr.open_数据集('test.nc'))
ds['var']=xr.其中((ds['var']为了能够使用方程进行条件计算,而不是仅使用常数进行计算,我根据@jhamman的代码,为形状为(月、lats、lons)的变量提供了条件迭代,如下所示:
import netCDF4 as nc
import numpy as np
import time
Tmin = -1.7
Tmax = 4.9
perc = (Tmax-Tmin)/100
lats = np.arange(0,384,1)
lons = np.arange(0,768,1)
months = [0,1]
dset = nc.Dataset('path/file.nc', 'r+')
start = time.time()
dset['var'][:][dset['var'][:] < Tmin] = 100
step1 = time.time()
print('Step1 took: ' + str(step1-start))
dset['var'][:][dset['var'][:] > Tmax] = 0
step2 = time.time()
print('Step2 took: ' + str(step2 - step1))
#start iteration of each dimension to alter individual values according to equation new_value = 100-((Old_value +1.8)/1%)
for m in months:
newstart = time.time()
for i in lats:
step3 = time.time()
print('month lats lat layer '+str(i)+' took: '+str(step3-newstart) +'s')
for j in lons:
if dset['var'][m,i,j] < Tmax and dset['var'][m,i,j] > Tmin:
dset['var'][m,i,j] = 100-((dset['var'][m,i,j]+1.8)/perc)
end = time.time()
print('One full month took: ' + str(end-start) +'s')
dset.close()
这是迭代的逻辑。不过,我想知道你们中是否有人知道如何加快速度。迭代对于这个目标真的是必要的吗?如果使用比例因子和添加偏移量压缩变量,请小心。在这种情况下,只有fill\u value属性指定的值将直接写入任何其他值都将自动压缩。
import netCDF4 as nc
import numpy as np
import time
Tmin = -1.7
Tmax = 4.9
perc = (Tmax-Tmin)/100
lats = np.arange(0,384,1)
lons = np.arange(0,768,1)
months = [0,1]
dset = nc.Dataset('path/file.nc', 'r+')
start = time.time()
dset['var'][:][dset['var'][:] < Tmin] = 100
step1 = time.time()
print('Step1 took: ' + str(step1-start))
dset['var'][:][dset['var'][:] > Tmax] = 0
step2 = time.time()
print('Step2 took: ' + str(step2 - step1))
#start iteration of each dimension to alter individual values according to equation new_value = 100-((Old_value +1.8)/1%)
for m in months:
newstart = time.time()
for i in lats:
step3 = time.time()
print('month lats lat layer '+str(i)+' took: '+str(step3-newstart) +'s')
for j in lons:
if dset['var'][m,i,j] < Tmax and dset['var'][m,i,j] > Tmin:
dset['var'][m,i,j] = 100-((dset['var'][m,i,j]+1.8)/perc)
end = time.time()
print('One full month took: ' + str(end-start) +'s')
dset.close()
Step1 took: 0.0343s
Step2 took: 0.0253s
month lats lat layer: 0.4064s
One full month took 250.8082s