0

我在 pandas 中读取 hdf 文件时遇到问题。截至目前,我不知道文件的密钥。

在这种情况下如何读取文件 [data.hdf]?而且,我的文件是 .hdf 而不是 .h5 ,它对数据获取有影响吗?

我看到您需要“商店中的组标识符”

pandas.io.pytables.read_hdf(path_or_buf, key, **kwargs)

我能够从 pytables 获取元数据

File(filename=data.hdf, title='', mode='a', root_uep='/', filters=Filters(complevel=0, shuffle=False, fletcher32=False, least_significant_digit=None))
/ (RootGroup) ''
/UID (EArray(317,)) ''
  atom := StringAtom(itemsize=36, shape=(), dflt='')
  maindim := 0
  flavor := 'numpy'
  byteorder := 'irrelevant'
  chunkshape := (100,)
/X Y (EArray(8319, 2, 317)) ''
  atom := Float32Atom(shape=(), dflt=0.0)
  maindim := 0
  flavor := 'numpy'
  byteorder := 'little'
  chunkshape := (1000, 2, 100)

如何通过 pandas 使其可读?

4

4 回答 4

1

首先(.hdf 或 .h5)没有任何区别。其次,我不确定熊猫,但我读了 HDF5 密钥,如:

import h5py
h5f = h5py.File("test.h5", "r")
h5f.keys()

或者

h5f.values()
于 2016-07-28T06:20:27.723 回答
0

文档在这里。但是,您将能够直接阅读您使用 pandas 显示的格式。你需要使用 PyTables 来读取它。即使没有 pandas 使用的元数据,pandas 也可以直接读取 PyTables Table 格式。

于 2014-06-16T11:08:40.610 回答
0

您可以使用这个简单的功能查看任何 HDF 文件的变量名称(仅适用于科学模式下的变量)

from pyhdf.SD  import *

def HDFvars(File):
    """
    Extract variable names for an hdf file
    """
    # hdfFile = SD.SD(File, mode=1)
    hdfFile = SD(File, mode=1)
    dsets = hdfFile.datasets()
    k = []
    for key in dsets.keys():
        k.append(key)
    k.sort()
    hdfFile.end() # close the file
    return k

如果变量不在科学模式下,您可以使用以下程序尝试 whit pyhdf.V ,该程序显示包含在任何 HDF 文件中的 vgroups 的内容。

from pyhdf.HDF import *
from pyhdf.V   import *
from pyhdf.VS  import *
from pyhdf.SD  import *

def describevg(refnum):
    # Describe the vgroup with the given refnum.
    # Open vgroup in read mode.
    vg = v.attach(refnum)
    print "----------------"
    print "name:", vg._name, "class:",vg._class, "tag,ref:",
    print vg._tag, vg._refnum

    # Show the number of members of each main object type.
    print "members: ", vg._nmembers,
    print "datasets:", vg.nrefs(HC.DFTAG_NDG),
    print "vdatas:  ", vg.nrefs(HC.DFTAG_VH),
    print "vgroups: ", vg.nrefs(HC.DFTAG_VG)

    # Read the contents of the vgroup.
    members = vg.tagrefs()

    # Display info about each member.
    index = -1
    for tag, ref in members:
        index += 1
        print "member index", index
        # Vdata tag
        if tag == HC.DFTAG_VH:
            vd = vs.attach(ref)
            nrecs, intmode, fields, size, name = vd.inquire()
            print "  vdata:",name, "tag,ref:",tag, ref
            print "    fields:",fields
            print "    nrecs:",nrecs
            vd.detach()

        # SDS tag
        elif tag == HC.DFTAG_NDG:
            sds = sd.select(sd.reftoindex(ref))
            name, rank, dims, type, nattrs = sds.info()
            print "  dataset:",name, "tag,ref:", tag, ref
            print "    dims:",dims
            print "    type:",type
            sds.endaccess()

        # VS tag
        elif tag == HC.DFTAG_VG:
            vg0 = v.attach(ref)
            print "  vgroup:", vg0._name, "tag,ref:", tag, ref
            vg0.detach()

        # Unhandled tag
        else:
            print "unhandled tag,ref",tag,ref

    # Close vgroup
    vg.detach()

# Open HDF file in readonly mode.
filename = 'yourfile.hdf'
hdf = HDF(filename)

# Initialize the SD, V and VS interfaces on the file.
sd = SD(filename)
vs = hdf.vstart()
v  = hdf.vgstart()

# Scan all vgroups in the file.
ref = -1
while 1:
    try:
        ref = v.getid(ref)
        print ref
    except HDF4Error,msg:    # no more vgroup
        break
    describevg(ref)
于 2018-10-17T14:56:34.150 回答
0

pyhdf将是 python 中 hdf 文件的替代选项

您可以从以下位置读取和查看密钥:

import pyhdf
hdf = pyhdf.SD.SD('file.hdf')
hdf.datasets()

我希望它会帮助你!好运

于 2016-07-28T09:04:48.217 回答