循环d时的有效netCDF分析

2024-09-27 07:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个与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矩阵(35285645像素),还是与一些内置的python方法相比,我的老派暴力方法简单地慢了下来。在

下面是一个我相信代码正在做什么的例子。如果temp<;0,它会查看时间并增加寒冷天数。如果temp>;=0,则cold days重置为0。在下图中,您将看到,第2行第1列的单元格每次通过时都会增加,但第2行第2列的单元格在时间1时递增,但在时间2时重置为零。在

有没有更有效的方法来翻阅这个netCDF数据集来执行这种类型的操作? Here is an example image


Tags: 方法inimportforif时间rangenetcdf
1条回答
网友
1楼 · 发布于 2024-09-27 07:25:27

似乎这只是一个小小的修改,只是在每个时间点把数据写出来。与此类似的东西应该会起作用:

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()

相关问题 更多 >

    热门问题