【问题标题】:How can extract data from .h5 file and save it in .txt or .csv properly?如何从 .h5 文件中提取数据并将其正确保存在 .txt 或 .csv 中?
【发布时间】:2019-10-07 20:13:48
【问题描述】:

经过大量搜索后,我找不到一种简单的方法来从.h5 中提取数据并将其通过NumpyPandas 传递给data.Frame,以便保存在.txt.csv 中文件。

import h5py
import numpy as np
import pandas as pd

filename = 'D:\data.h5'
f = h5py.File(filename, 'r')

# List all groups
print("Keys: %s" % f.keys())
a_group_key = list(f.keys())[0]

# Get the data
data = list(f[a_group_key])
pd.DataFrame(data).to_csv("hi.csv")
Keys: <KeysViewHDF5 ['dd48']>

当我打印数据时,我看到以下结果:

print(data)
['axis0',
 'axis1',
 'block0_items',
 'block0_values',
 'block1_items',
 'block1_values']

如果有人向我解释它们是什么以及如何完全提取数据并将其保存在 .csv 文件中,我将不胜感激。似乎还没有常规的方法来做到这一点,而且还具有挑战性!到目前为止,我只能通过以下方式查看部分数据:

import numpy as np 
dfm = np.fromfile('D:\data.h5', dtype=float)
print (dfm.shape)
print(dfm[5:])

dfm=pd.to_csv('train.csv')
#dfm.to_csv('hi.csv', sep=',', header=None, index=None)

我的期望是在.h5 文件中提取time_stampsmeasurements

【问题讨论】:

    标签: python pandas numpy hdf5 data-extraction


    【解决方案1】:

    看起来数据是 Pandas 写的,所以使用pd.read_hdf() 读取。

    【讨论】:

    • 嗨,它不起作用,看:reread = pd.read_hdf('D:\data.h5') 和由于ImportError: HDFStore requires PyTables, "No module named 'tables'" problem importing 我更新/安装了pytables pip install --upgrade tables 但现在我遇到了ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C header, got 192 from PyObject。你有什么想法吗?
    • @Mario,您可能需要更新或全新安装pandas 和/或numpy。如果h5 是用pandaspytables 编写的,那么使用相同的工具阅读它会容易得多。 h5py 是文件的较低级别接口,仅使用 numpy 数组。所以它可以读取文件,但是从数组构建数据框会比较麻烦,并且需要更多关于 pandas 内部的知识。
    • @hpaulj 我使用的numpy 版本是1.15.4,pip 是1.16.3,我使用的Pandas 版本是0.23.4,pip 是0.24.1可以看到here。我无法更新它,因为它与 Keras nad TF 不兼容,但感谢您的考虑。
    • @Mario:您只需要安装 PyTables,可能使用与获取 Pandas 相同的包管理器。
    • Mario,您可以使用上述任何 Python 模块(Pandas、PyTables 或 h5py)读取 HDF5 文件。我不使用熊猫,所以无能为力。 Pytables 还可以将数据集提取到 numpy 数组中。如果您是 HDF5 新手,我建议您从 The HDF Group 安装 HDFView 以查看文件中的数据和结构。恕我直言,在您掌握编码之前,“查看”您的数据非常有帮助。另外,如果你一次只需要获取几个数据集,它有一个导出工具,可以写一个 CSV 文件,你可以跳过编码。
    【解决方案2】:

    h5py 将访问 HDF5 数据集作为 numpy 数组。您获取密钥的调用会返回数据集名称的 LIST。现在你有了它们,将它们作为一个 numpy 数组访问并编写它们应该非常简单。您需要获取 dtype 才能知道每列中的内容才能正确格式化。

    更新于 2019 年 5 月 22 日,以反映在评论链接中发布的 data.h5 的内容。 np.savetxt() 中的默认格式为 '%.18e'。提供了非常简单(粗略)的逻辑来根据这些数据集的 dtype 修改格式。这需要更强大的 dtype 检查和格式化以供一般使用。此外,您还需要添加逻辑来解码 unicode 字符串。

    import h5py
    filename = 'D:\data.h5'
    import numpy as np
    h5f = h5py.File(filename, 'r')
    # get a List of data sets in group 'dd48'
    a_dset_keys = list(h5f['dd48'].keys())
    
    # Get the data
    for dset in a_dset_keys :
        ds_data = (h5f['dd48'][dset])
        print ('dataset=', dset)
        print (ds_data.dtype)
        if ds_data.dtype == 'float64' :
            csvfmt = '%.18e'
        elif ds_data.dtype == 'int64' :
            csvfmt = '%.10d'
        else:
            csvfmt = '%s'
        np.savetxt('output_'+dset+'.csv', ds_data, fmt=csvfmt, delimiter=',')
    

    【讨论】:

    • 感谢您的回复。考虑到这是data.h5,我应该如何配置您的 sn-p 中的最后一行以在 csv 文件中以正确且可读的格式实现数据?您会通过更新来形成完整的答案吗?我想了解如何配置每列以正确格式化。我也收到了data = list(f[grp]) 的错误KeyError: "Unable to open object (object 'd' doesn't exist)"
    • 你能解释一下['axis0', 'axis1', 'block0_items', 'block0_values', 'block1_items', 'block1_values'] 是什么吗?我们在技术上如何称呼它们以及在数据提取方面我们应该如何了解它们?它们看起来像一些包含一些信息的文件夹。您能在回答中简短地解释一下吗?
    • Mario,这些是文件中顶级节点的名称。节点可以是组或数据集。 (我假设它们是我编码的数据集)您可以使用isinstance(data, h5py.Dataset): 上的测试来确认数据集。它们按名称访问,如代码data = list(f[grp]) 所示。 data 是您创建的列表 a_group_keys 中名称为 grp 的数据集对象。
    • 感谢您的解释。当我在第一条评论中上传data.h5 时,我想将数据转换为.csv 格式。您会根据上传的文件完成答案的最后一部分,以便我了解您的offred答案中的这种转换预固化是如何工作的吗?我在你的 sn-p 末尾尝试了data['dd48'].to_csv('data.csv'),但我收到了这个错误KeyError: "Unable to open object (object 'd' doesn't exist)"
    • @Mario 使用简单的解决方案。 :) 如果您想专门使用 numpy 数组,我的代码是合适的。对于你的场景来说可能有点矫枉过正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多