从 hdf 文件中获取列名(标题)

Posted

技术标签:

【中文标题】从 hdf 文件中获取列名(标题)【英文标题】:Get column names (headers) from hdf file 【发布时间】:2014-10-19 03:25:17 【问题描述】:

我想知道如何获取 hdf 文件的列名(似乎存储在 hdf 标题中);例如,一个文件可能有名为 [a,b,c,d] 的列,而另一个文件有 [a,b,c] 列,而另一个文件有 [b,e,r,z] 列;我想知道哪些有哪些。任何帮助将不胜感激!

【问题讨论】:

我不了解 hdfstore,但您所说的“列”在 HDF5 术语中可能是复合数据类型的成员。不幸的是,hdfstore 似乎没有检查数据类型的能力。使用 h5py,您可以:api.h5py.org/h5t.html#h5py.h5t.TypeCompoundID 【参考方案1】:

要在 python 之外执行此操作,您可以通过 h5dump --header my.hdf5 之类的方式使用 h5dump

在python中你可以使用h5py

作为一个例子,我可以通过以下方式访问我的 HDF-EOS5 文件的字段名称:

>>> import h5py
>>> f = h5py.File('/tmp/temp.hdf','r')
>>> f.keys()
[u'HDFEOS', u'HDFEOS INFORMATION']
>>> f.values()
[<HDF5 group "/HDFEOS" (2 members)>, <HDF5 group "/HDFEOS INFORMATION" (2 members)>]
>>> grpname = f.require_group('/HDFEOS')
>>> grpname.keys()
[u'ADDITIONAL', u'GRIDS']
>>> grpname.values()
[<HDF5 group "/HDFEOS/ADDITIONAL" (1 members)>, <HDF5 group "/HDFEOS/GRIDS" (9 members)>]
>>> subgrpname = grpname.require_group('/HDFEOS/GRIDS')
>>> subgrpname.keys()
[u'355nm_band', u'380nm_band', u'445nm_band', u'470nm_band', u'555nm_band', u'660nm_band', u'865nm_band', u'935nm_band', u'Ancillary']
>>> group_660 = subgrpname.require_group('660nm_band')
>>> group_660.keys()
[u'Data Fields']
>>> group_660.values()
[<HDF5 group "/HDFEOS/GRIDS/660nm_band/Data Fields" (20 members)>]
>>> fields_660 = group_660.require_group('Data Fields')
>>> fields_660.keys()
[u'AOLP_meridian', u'AOLP_scatter', u'DOLP', u'Glint_angle', u'I', u'I.mask', u'IPOL', u'Q.mask', u'Q_meridian', u'Q_scatter', u'RDQI', u'Scattering_angle', u'Sun_azimuth', u'Sun_zenith', u'Time_in_seconds_from_epoch', u'U.mask', u'U_meridian', u'U_scatter', u'View_azimuth', u'View_zenith']
>>> fields_660.values()
[<HDF5 dataset "AOLP_meridian": shape (3072, 3072), type "<f4">, <HDF5 dataset "AOLP_scatter": shape (3072, 3072), type "<f4">, <HDF5 dataset "DOLP": shape (3072, 3072), type "<f4">, <HDF5 dataset "Glint_angle": shape (3072, 3072), type "<f4">, <HDF5 dataset "I": shape (3072, 3072), type "<f4">, <HDF5 dataset "I.mask": shape (3072, 3072), type "<i4">, <HDF5 dataset "IPOL": shape (3072, 3072), type "<f4">, <HDF5 dataset "Q.mask": shape (3072, 3072), type "<i4">, <HDF5 dataset "Q_meridian": shape (3072, 3072), type "<f4">, <HDF5 dataset "Q_scatter": shape (3072, 3072), type "<f4">, <HDF5 dataset "RDQI": shape (3072, 3072), type "<f4">, <HDF5 dataset "Scattering_angle": shape (3072, 3072), type "<f4">, <HDF5 dataset "Sun_azimuth": shape (3072, 3072), type "<f4">, <HDF5 dataset "Sun_zenith": shape (3072, 3072), type "<f4">, <HDF5 dataset "Time_in_seconds_from_epoch": shape (3072, 3072), type "<f8">, <HDF5 dataset "U.mask": shape (3072, 3072), type "<i4">, <HDF5 dataset "U_meridian": shape (3072, 3072), type "<f4">, <HDF5 dataset "U_scatter": shape (3072, 3072), type "<f4">, <HDF5 dataset "View_azimuth": shape (3072, 3072), type "<f4">, <HDF5 dataset "View_zenith": shape (3072, 3072), type "<f4">]

【讨论】:

这些不是数据集的名称,而不是数据集中的列名吗? 我不确定你在问什么。这些是数据集的名称。虽然我称它们为字段,但如果这就是您的意思,我并不是指 vdata 的列,而是包含数据值的数据字段。例如,AOLP_meridian“字段”的所有 3072 列都只是数字索引。我上面使用的数据使用特定行和列的数据值来表示该数据集在该物理位置的值。 我明白了。我很困惑。我们使用“表”模块(pytables)。我在这里提到它以防有一天它可以帮助某人。我试图访问使用 h5py 使用表创建的文件,这给我带来了麻烦。 如果 keys() 返回“/”,而“表”确实有名称,该怎么办?我在 coursera 数据集中发现了这一点,辅助函数调用表名,但使用键/值不返回任何内容。这很奇怪……? 你在 values() 中得到了什么吗?如果没有任何组,我相信键可能是空的...

以上是关于从 hdf 文件中获取列名(标题)的主要内容,如果未能解决你的问题,请参考以下文章

HDFStore 获取列名

是否可以从 Python 的 HDF5 文件中的复合数据集中读取字段名称?

HDF5:有没有办法重命名现有 HDF5 表中的列名?

在 Fortran 中获取 HDF5 文件名的长度?

从 HDF5 获取表索引的最有效方法

如何从镶木地板文件中获取架构/列名?