Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环浏览netcdf文件并运行计算-Python或R_Python_R_Netcdf - Fatal编程技术网

循环浏览netcdf文件并运行计算-Python或R

循环浏览netcdf文件并运行计算-Python或R,python,r,netcdf,Python,R,Netcdf,这是我第一次使用netCDF,我正努力用它来工作 我有多个版本3 netcdf文件(NOAA NARR air全年每日平均数为2万)。每个文件跨越1979-2012年间的一年。它们是349 x 277网格,分辨率约为32km。数据是从中下载的 维度是时间(自1800年1月1日起的小时数),我感兴趣的变量是空气。我需要计算温度

这是我第一次使用netCDF,我正努力用它来工作

我有多个版本3 netcdf文件(NOAA NARR air全年每日平均数为2万)。每个文件跨越1979-2012年间的一年。它们是349 x 277网格,分辨率约为32km。数据是从中下载的

维度是时间(自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()
如果我尝试在中查看生成的文件,似乎没有问题: 还要注意,这里我刚刚下载了两个数据集进行测试,所以我使用了

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


下面是一个
R
解决方案

infiles <- list.files("data", pattern = "nc", full.names = TRUE, include.dirs = TRUE)

outfile <- "data/air.colddays.nc"     

library(raster)

r <- raster::stack(infiles) 
r <- sum((r - 273.15) < 0)

plot(r)

infiles我知道,从2013年开始,这篇文章已经很晚了,但我只想指出,公认的解决方案并不能解决所提出的确切问题。该问题似乎希望温度在零度以下的每个连续周期的长度(请注意,在问题中,如果温度超过零,计数器将重置),这对于气候应用(例如农业)可能很重要,而公认的解决方案仅给出一年中温度在零度以下的总天数。如果这确实是mkmitchell想要的(已被接受为答案),则可以从cdo中的命令行执行,而无需担心NETCDF输入/输出:

 cdo timsum -lec,273.15 in.nc out.nc
所以循环脚本应该是:

files=`ls *.nc` # pick up all the netcdf files in a directory
for file in $files ; do
    # I use 273.15 as from the question seems T is in Kelvin 
    cdo timsum -lec,273.15 $file ${file%???}_numdays.nc
done 
如果需要整个期间的总数,则可以使用较小的_numdays文件:

cdo cat *_numdays.nc total.nc 
cdo timsum total.nc total_below_zero.nc 

但同样,这个问题似乎需要每个事件的累计天数,这是不同的,但不是公认的答案所提供的

谢谢你,先生!这正是我想要的,而且比我预期的要深入得多。你为我节省了很多时间。社区给我留下了深刻的印象。我在另一篇文章中提到过这一点,但令人遗憾的是,MFDataset在python中不能用于NetCDF4,即使有一些限制。MFDataset的使用有很多很好的例子,这些对于很多遗留文件都很好,但对于最新的标准来说却不是。我在上面加了一条评论,说明这个解决方案(虽然优雅而详细)并没有回答提出的问题,因为它提供了一年中的总天数低于零,而不是每一个低于冰点的连续时间的长度,这对农业来说可能很重要。我知道从2013年开始,这条线已经很晚了,但我只想指出,公认的解决方案并不能解决所提出的问题。问题似乎希望温度低于零的每个连续周期的长度(请注意,如果温度超过零,计数器将重置),而此解决方案仅给出一年中温度低于零的总天数。这不是一个微妙的区别。如果只需要总天数,则应编辑问题以说明这一点。
files=`ls *.nc` # pick up all the netcdf files in a directory
for file in $files ; do
    # I use 273.15 as from the question seems T is in Kelvin 
    cdo timsum -lec,273.15 $file ${file%???}_numdays.nc
done 
cdo cat *_numdays.nc total.nc 
cdo timsum total.nc total_below_zero.nc