gpt4 book ai didi

python - 遍历 netcdf 文件并运行计算 - Python 或 R

转载 作者:太空狗 更新时间:2023-10-29 21:20:01 25 4
gpt4 key购买 nike

这是我第一次使用 netCDF,我正努力全神贯注地使用它。

我有多个第 3 版 netcdf 文件(NOAA NARR air.2m 全年日平均值)。每个文件跨越 1979 年至 2012 年之间的一年。它们是 349 x 277 网格,分辨率约为 32 公里。数据下载自 here .

维度是时间(自 1800 年 1 月 1 日起的小时数),我感兴趣的变量是空气。我需要计算温度 < 0 的累计天数。例如

    Day 1 = +4 degrees, accumulated days = 0
Day 2 = -1 degrees, accumulated days = 1
Day 3 = -2 degrees, accumulated days = 2
Day 4 = -4 degrees, accumulated days = 3
Day 5 = +2 degrees, accumulated days = 0
Day 6 = -3 degrees, accumulated days = 1

我需要将这些数据存储在一个新的 netcdf 文件中。我熟悉 Python,有点熟悉 R。每天循环的最佳方法是什么,检查前几天的值,并基于此将值输出到具有完全相同维度和变量的新 netcdf 文件...... . 或者可能只是将另一个变量添加到原始 netcdf 文件中,其中包含我正在寻找的输出。

最好将所有文件分开还是合并?我将它们与 ncrcat 结合使用,效果很好,但文件是 2.3gb。

感谢您的输入。

我目前在python方面的进展:

import numpy
import netCDF4
#Change my working DIR
f = netCDF4.Dataset('air7912.nc', 'r')
for a in f.variables:
print(a)

#output =
lat
long
x
y
Lambert_Conformal
time
time_bnds
air

f.variables['air'][1, 1, 1]
#Output
298.37473

为了帮助我更好地理解我正在使用哪种类型的数据结构? ['air'] 是上面例子中的键吗,[1,1,1] 也是键吗?得到 298.37473 的值。我怎样才能遍历 [1,1,1]?

最佳答案

您可以使用 netCDF4 中非常好的 MFDataset 功能将一堆文件视为一个聚合文件,而无需使用 ncrcat。所以你的代码看起来像这样:

from pylab import *
import netCDF4

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)

for i in xrange(ntimes):
cold_days += atemp[i,:,:].data-273.15 < 0

pcolormesh(cold_days)
colorbar()

generated image of cold days

这是一种写入文件的方法(可能有更简单的方法):

# create NetCDF file
nco = netCDF4.Dataset('/usgs/data2/notebook/cold_days.nc','w',clobber=True)
nco.createDimension('x',nx)
nco.createDimension('y',ny)

cold_days_v = nco.createVariable('cold_days', 'i4', ( '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'

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 ['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 lon,lat,x and y
lono[:]=f.variables['lon'][:]
lato[:]=f.variables['lat'][:]
xo[:]=f.variables['x'][:]
yo[:]=f.variables['y'][:]

# write the cold_days data
cold_days_v[:,:]=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()

如果我尝试查看 the Unidata NetCDF-Java Tools-UI GUI 中的结果文件,似乎还可以: enter image description here另请注意,这里我只是下载了两个数据集进行测试,所以我使用了

f = netCDF4.MFDataset('/usgs/data2/rsignell/models/ncep/narr/air.2m.19??.nc')

举个例子。对于所有数据,您可以使用

f = netCDF4.MFDataset('/usgs/data2/rsignell/models/ncep/narr/air.2m.????.nc')

f = netCDF4.MFDataset('/usgs/data2/rsignell/models/ncep/narr/air.2m.*.nc')

关于python - 遍历 netcdf 文件并运行计算 - Python 或 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com