如何将多维数据nc文件数据转换为三列格式

时间:2014-09-22 17:42:44

标签: python r matlab multidimensional-array netcdf

有没有人可以帮助我,我从matlab R2013b中的.nc(netcdf)文件中读取数据。 我得到了这种变量

Variables:
    time     
           Size:       1x1
           Dimensions: time
           Datatype:   double
           Attributes:
                       units    = 'hours since 0001-01-01 01:00:00.0'
                       calendar = 'gregorian'
    latitude 
           Size:       801x1
           Dimensions: latitude
           Datatype:   single
           Attributes:
                       units = 'degrees_north'
    longitude
           Size:       1501x1
           Dimensions: longitude
           Datatype:   single
           Attributes:
                       units = 'degrees_east'
     DEN      
           Size:       1501x801x1
           Dimensions: longitude,latitude,time
           Datatype:   single
           Attributes:
                       least_significant_digit = 1
                       long_name               = 'Density'
                       units                   = 'Density Index'
     HGH      
           Size:       1501x801x1
           Dimensions: longitude,latitude,time
           Datatype:   single
           Attributes:
                       least_significant_digit = 1
                       long_name               = 'High level'
                       units                   = 'm'   
....etc

我需要这样的格式:

longitude, latitude = DEN
....       ....       ...
....       ....       ...
....       ....       ...

所有数据。

我可以读取每个变量,如经度或DEN,但是像DEN和HGH这样有三维我不知道如何从DEN或HGH中经度和纬度合并。

你有什么建议吗,如果你有python或R的解决方案,请给出读取nc文件的方法。

提前致谢

2 个答案:

答案 0 :(得分:0)

编辑:拼写错误

我为此推荐Python。

import netCDF4

filename = '/your/filename.nc'

# Read in the file
ncfile = netCDF4.Dataset(filename, 'r')
lat = ncfile.variables['latitude'][:,0]
lon = ncfile.variables['longitude'][:,0]
den = ncfile.variables['DEN'][:,:,0]

nlat, nlon = len(lat), len(lon)
# den is now 2D
for y in range(nlat):
    for x in range(nlon):
        print('Lat:{0}, Lon:{1}, DEN:{2}'.format(lat[y], lon[x], den[x,y]))

ncfile.close()

答案 1 :(得分:0)

在R中,您可以非常简单地使用包reshapencdf(在此示例中,由于您未提供netcdf文件,因此我每年都会使用NOAA气温数据集):

library(ncdf)
download.file("ftp://ftp.cdc.noaa.gov/Datasets/ncep/air.2004.nc",destfile="air.nc")
nc <- open.ncdf("air.nc") #Open the netcf file
dat <- get.var.ncdf(nc,'air') #Grabbing the data, in your case replace 'air' with 'DEN'
dat <- dat[,,1,1] #To simulate your 2D data, in your case you already have 2D data so you can skip that
lat <- get.var.ncdf(nc,'lat') #Grabbing the latitude, in your case replace 'lat' with 'latitude'
lon <- get.var.ncdf(nc,'lon') #Grabbing the longitude, in your case replace 'lon' with 'longitude'

此时您的数据是一个具有未命名维度的矩阵。让我们根据您的经度和纬度命名:

colnames(dat) <- lat
rownames(dat) <- lon

然后您正在寻找的只是以下结果:

library(reshape) 
melt(dat)