首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将hdf中的网格卫星swath数据转换为netcdf4,这是从美国宇航局全球GPM卫星上获得的?

如何将hdf中的网格卫星swath数据转换为netcdf4,这是从美国宇航局全球GPM卫星上获得的?
EN

Stack Overflow用户
提问于 2019-11-15 07:05:29
回答 2查看 1.3K关注 0票数 1

我正在尝试访问从https://disc.gsfc.nasa.gov/datasets?keywords=LATENT%20HEATING&page=1中可以在hdf中获得的网格化卫星条带数据,您可以看到任何3级数据,这就是我试图使用的数据。我熟悉netcdf可视化库,如ferret和netcdf操作软件,如cdo和nco。我希望将这些带网格的数据转换为netcdf,以便使用cdo和nco进行平滑分析。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-15 07:11:14

我从您共享的链接中下载了文件3B-ORBIT.GPM.DPRGMI.3GCSHv6-0.20190626-S064516-E081748.030252.V06A.HDF5,并创建了一个程序,该程序以文件名为参数,并使用变量latentHeating、surfacePrecipRate和stratiformFraction生成一个netcdf文件。让我澄清一下,这个文件是一个网格化的卫星条带数据。您可能需要做一些其他的事情来使网格化的数据从像素级的条带数据中提取出来。

代码语言:javascript
复制
import h5py
import numpy as np
import datetime as dt
import xarray as xr
import sys

input_file = sys.argv[1]
f = h5py.File(input_file, 'r')

yy = np.max(f['Grid']['GridTime']['Year'][:])
mm = np.max(f['Grid']['GridTime']['Month'][:])
dd = np.max(f['Grid']['GridTime']['DayOfMonth'][:])

time_ = dt.datetime(yy, mm, dd)
lat = np.linspace(-67+0.25/2,67-0.25/2,536)
lon = np.linspace(-180+0.25/2,180-0.25/2,1440)
lev = np.arange(0.125,0.125+0.25*80,0.25)

lh = f['Grid']['latentHeating'][:]
spr = f['Grid']['surfacePrecipRate'][:]
stratfrac = f['Grid']['stratiformFraction'][:]
lh[lh==-9999.9] = np.nan
spr[spr==-9999.9] = np.nan
stratfrac[stratfrac==-9999.9] = np.nan

stratfrac = stratfrac.T
spr = spr.T
lh = lh.swapaxes(1,2)
lh = lh[np.newaxis,...]

stratfrac = stratfrac[np.newaxis,...]
spr = spr[np.newaxis,...]

df = xr.Dataset(
        data_vars={'latentHeating':    (('time', 'level', 'latitude', 
'longitude' ), lh),
                   'surfacePrecipRate':    (('time', 'latitude', 
'longitude' ), spr),
                   'stratiformFraction':    (('time', 'latitude', 
'longitude'), stratfrac)},
        coords={ 'time':np.atleast_1d((time_- 
dt.datetime(1,1,1)).days+2),
            'level': lev,
            'longitude': lon,
            'latitude': lat,
        })
df.latentHeating.attrs['long_name'] = 'Latent Heating'
df.surfacePrecipRate.attrs['long_name'] = 'Surface Precipitation Rate'
df.stratiformFraction.attrs['long_name'] = 'Stratiform Fraction'

df.time.attrs['units'] = 'days since 01-01-01 00:00:00'
df.time.attrs['standard_name'] = 'time'
df.time.attrs['long_name'] = 'Year AD'
df.time.attrs['calendar'] = 'standard'

df.longitude.attrs['standard_name'] = 'longitude'
df.longitude.attrs['long_name'] = 'longitude'
df.longitude.attrs['units'] = 'degrees_east'
df.longitude.attrs['axis'] = 'X'

df.latitude.attrs['standard_name'] = 'latitude'
df.latitude.attrs['long_name'] = 'latitude'
df.latitude.attrs['units'] = 'degrees_north'
df.latitude.attrs['axis'] = 'Y'

df.level.attrs['standard_name'] = 'air_pressure'
df.level.attrs['long_name'] = 'pressure_level'
df.level.attrs['units'] = 'km' 
df.level.attrs['axis'] = 'Z'
df.level.attrs['positive'] = 'up'
df.to_netcdf(input_file[:-4]+'nc')

您只需将其保存为python文件,并将hdf文件作为参数传递。

票数 0
EN

Stack Overflow用户

发布于 2019-11-15 15:47:42

来自这里发布的答案:Convert hdf5 to netcdf4 in bash, R, python or NCL?

最简单的方法是:

代码语言:javascript
复制
nccopy in.h5 out.nc
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58871896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档