Skip to main content
 首页 » 编程设计

python之循环数据时的高效 netCDF 分析

2025年05月04日10hnrainll

这是与 this question 有关的跟进问题.

感谢之前的帮助,我已经成功导入了一个 netCDF 文件(或带有 MFDataset 的文件),并且能够将不同的时间相互比较以创建另一个累积数据集。这是当前代码的一部分。

from numpy import * 
import netCDF4 
import os 
 
f = netCDF4.MFDataset('air.2m.1979.nc') 
 
atemp = f.variables['air'] 
 
ntimes, ny, nx = atemp.shape 
cold_days = zeros((ntimes, ny, nx), dtype=int) 
 
for i in range(ntimes): 
  for b in range(ny): 
    for c in range(nx): 
      if i == 1: 
          if atemp[i,b,c] < 0: 
            cold_days[i,b,c] = 1 
          else: 
            cold_days[i,b,c] = 0 
      else: 
        if atemp[i,b,c] < 0: 
          cold_days[i,b,c] = cold_days[i-1,b,c] + 1 
        else: 
          cold_days[i,b,c] = 0 

这似乎是完成工作的一种蛮力方式,虽然它有效,但需要很长时间。我不确定是否需要这么长时间,因为我正在处理 365 349x277 矩阵(35,285,645 像素),或者如果我的旧学校蛮力方式与一些内置的 python 方法相比太慢了。

下面是我认为代码正在执行的操作的示例。它查看时间并在温度 < 0 时增加冷天数。如果温度 >= 0,则冷天数重置为 0。在下图中,您将看到第 2 行第 1 列的单元格在每次经过时递增,但单元格位于第 2 行第 2 列在时间 1 时递增,但在时间 2 时重置为零。

是否有更有效的方法来遍历此 netCDF 数据集以执行此类操作?

请您参考如下方法:

这似乎是一个小修改——只需在每个时间步写出数据。接近于此的东西应该可以工作:

from pylab import * 
import netCDF4 
 
# open NetCDF input files 
 
f = netCDF4.MFDataset('/usgs/data2/rsignell/models/ncep/narr/air.2m.19??.nc') 
# print variables 
f.variables.keys() 
 
atemp = f.variables['air'] 
print atemp 
 
ntimes, ny, nx = shape(atemp) 
cold_days = zeros((ny,nx),dtype=int) 
 
# create output NetCDF file 
 
nco = netCDF4.Dataset('/usgs/data2/notebook/cold_days.nc','w',clobber=True) 
nco.createDimension('x',nx) 
nco.createDimension('y',ny) 
nco.createDimension('time',ntimes) 
 
cold_days_v = nco.createVariable('cold_days', 'i4',  ( 'time', 'y', 'x')) 
cold_days_v.units='days' 
cold_days_v.long_name='total number of days below 0 degC' 
cold_days_v.grid_mapping = 'Lambert_Conformal' 
 
timeo = nco.createVariable('time','f8',('time')) 
lono = nco.createVariable('lon','f4',('y','x')) 
lato = nco.createVariable('lat','f4',('y','x')) 
xo = nco.createVariable('x','f4',('x')) 
yo = nco.createVariable('y','f4',('y')) 
lco = nco.createVariable('Lambert_Conformal','i4') 
 
# copy all the variable attributes from original file 
for var in ['time','lon','lat','x','y','Lambert_Conformal']: 
    for att in f.variables[var].ncattrs(): 
        setattr(nco.variables[var],att,getattr(f.variables[var],att)) 
 
# copy variable data for time, lon,lat,x and y 
timeo[:] = f.variables['time'][:] 
lato[:] = f.variables['lat'][:] 
xo[:] = f.variables['x'][:] 
yo[:] = f.variables['y'][:] 
 
for i in xrange(ntimes): 
    cold_days += atemp[i,:,:].data-273.15 < 0 
    #  write the cold_days data 
    cold_days_v[i,:,:]=cold_days 
 
 
# copy Global attributes from original file 
for att in f.ncattrs(): 
    setattr(nco,att,getattr(f,att)) 
 
nco.Conventions='CF-1.6' 
nco.close()