爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 14070|回复: 4

[经验总结] 用Python读取和写入hdf文件

[复制链接]

新浪微博达人勋

发表于 2016-7-27 15:50:49 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
网上有很多用python读取hdf文件的教程,没看到有写入的,研究了一下,发个帖分享。

读取hdf:

import glob
from pyhdf import SD

hdf_name1 = glob.glob('c:/python/MCD43GF_bsa_Band1_001_2008.hdf')

print("file found {}".format(hdf_name1))
hdf_obj1 = SD.SD(hdf_name1[0],SD.SDC.READ)
print(hdf_obj1.datasets().keys())
Map1 = hdf_obj1.select('Albedo_Map_0.659')[:,:]
lon = hdf_obj1.select('longitude')[:]
lat = hdf_obj1.select('latitude')[:]

hdf_obj1.end()

首先要知道hdf文件中包含哪些量,我的文件中包含地表反照率的值,以及经纬度,总共三个量,就分开赋值到三个数组。


写入hdf文件(我是写了一个调用函数):

from pyhdf.SD import*

def white_hdf(Albedo, lat ,lon):

hdf_name = 'Albedo.hdf'

sd = SD(hdf_name[:], SDC.CREATE|SDC.WRITE)
sds1 = SD.create(sd, 'Albedo', SDC.INT32,(1200,1600))
sds2 = SD.create(sd, 'lon', SDC.FLOAT32, (1200))
sds3 = SD.create(sd, 'lat', SDC.FLOAT32, (1600))
sds1.setfillvalue(0)
sds2.setfillvalue(0)
sds3.setfillvalue(0)

dim1 = sds1.dim(0)
dim2 = sds1.dim(1)

dim3 = sds2.dim(0)

dim4 = sds3.dim(0)

sds1[:,:] = Albedo
sds2[:]  = lon
sds3[:] = lat

sd.end
return sds1,sds2,sds3


sds1,sds2,sds3表示建立三个量,dim用来设定维数。

如有问题,欢迎大家指正。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-1-7 23:09:57 | 显示全部楼层
请问楼主有试过用MATLAB吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-4-10 14:20:31 | 显示全部楼层
语韵521 发表于 2017-1-7 23:09
请问楼主有试过用MATLAB吗?

试过,只是平常习惯用python
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-1-18 21:50:29 | 显示全部楼层
{:5_213:}{:5_213:}{:5_213:}感谢楼主!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2023-4-10 18:02:25 | 显示全部楼层
你好,如果hdf数据只包括Fpar_500m', 'Lai_500m', 'FparLai_QC', 'FparExtra_QC', 'FparStdDev_500m', 'LaiStdDev_500m,如何获取 'Lai_500m’的经纬度来画图呢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表