如何使用 python pandas 打开 nxs 文件?

Posted

技术标签:

【中文标题】如何使用 python pandas 打开 nxs 文件?【英文标题】:How can I open an nxs file with python pandas? 【发布时间】:2014-06-27 09:36:04 【问题描述】:

我有一个 Nexus 文件 (foo.nxs),其中包含来自测量的直接数据,我希望用 pandas 打开它。但是,当我尝试典型的

HDFStore('foo.nxs') or read_hdf('foo.nxs','/group')

它只是返回一个空的 Store:

<class 'pandas.io.pytables.HDFStore'>
File path: /foo.nxs
Empty

或类型错误:

TypeError: cannot create a storer if the object is not existing nor a value are passed

文档页面中的所有示例都首先创建一个 hdf 文件,在其中存储数据然后检索它,但这是从同一个 pandas 完成的。我想知道是否可以读取以前不是用 pandas 生成的 hdf 文件。

根据@Jeff 的要求,这是 ptdump 的部分输出:

/ (RootGroup) ''
  /._v_attrs (AttributeSet), 4 attributes:
    [HDF5_Version := '1.8.11',
    NeXus_version := '4.3.0',
    file_name := '/Messdaten/C9/20140423/messung_21h14m01.197.nxs',
    file_time := '2014-04-23T21:14:01+01:00']
/exp_root.Kerr.DoublePulse2D.SuperDuperScan_V2_00001 (Group) ''
  /exp_root.Kerr.DoublePulse2D.SuperDuperScan_V2_00001._v_attrs (AttributeSet), 1 attributes:
   [NX_class := 'NXentry']
/exp_root.Kerr.DoublePulse2D.SuperDuperScan_V2_00001/scan_data (Group) ''
  /exp_root.Kerr.DoublePulse2D.SuperDuperScan_V2_00001/scan_data._v_attrs (AttributeSet), 1 attributes:
   [NX_class := 'NXdata']
/exp_root.Kerr.DoublePulse2D.SuperDuperScan_V2_00001/scan_data/actuator_1_1 (CArray(5, 121), zlib(6)) ''
  atom := Float64Atom(shape=(), dflt=0.0)
  maindim := 0
  flavor := 'numpy'
  byteorder := 'little'
  chunkshape := (5, 121)

【问题讨论】:

但是这个.nxs文件是hdf文件吗?我的意思是,nexus 使用 hdf 作为底层二进制格式,但它也是普通的 hdf 文件吗? HDFStore 可以读取一个普通的PyTables 表格式,它不是用元数据(pandas 通常使用的)创建的,pandas.pydata.org/pandas-docs/stable/…。发布ptdump -av foo.nxs @Jeff ptdump 为我的文件输出组和节点的名称及其数据内容和相应的属性,就像在任何 hdf5 中一样。所以做不到? 这将有助于显示 ptdump 输出什么 很难阅读,最好编辑您的问题。 【参考方案1】:

你有一个普通的 PyTables 存储。所以这些实际上很容易阅读(并且不需要 pandas),但这将向您展示如何阅读它们(作为 numpy 数组)。

with pd.get_store('test.h5') as store:
     data = store.root.exp_root.Kerr.DoublePulse2D.SuperDuperScan_V2_00001/scan_data/actuator_1_1.read()

文档是here。

这只是抓取 PyTables 根节点并读取数据。这是CArray 格式,是一个简单的数组。

HDFStore 将能够读取普通的 PyTables Table 对象(没有元数据),但足够简单,只需读取数组即可。

【讨论】:

谢谢,但我想将整个文件检索到一个已经包含标签的对象中。否则我可以使用tables.openFile().getNode().read() 轻松做到这一点。我以为 pandas 的优势是能够处理带标签的数据,但是如果你不能直接从文件中读取它,那它有什么用呢? HDFStore 构建在 PyTables 之上,因此您当然可以使用较低级别的函数读取数据。如果您愿意,您还可以读入数据并以适当的格式写入新存储。您存储的格式可能包含元数据,但 pandas 未设置为猜测任意格式。如果这是一种流行的格式,您可能希望编写并贡献一个转换器。

以上是关于如何使用 python pandas 打开 nxs 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 hdf5 中有效地保存 python pandas 数据帧并将其作为 R 中的数据帧打开?

如何使用 Python 和 Pandas 创建比 RAM 更大的 csv 文件

如何根据当前日期使用 python Pandas 从 Excel 工作表加载特定工作簿

无法让熊猫打开 CSV [Python, Jupyter, Pandas]

python怎么打开pandas

观察从网络虚拟化到虚拟云网络 VMware NXS实现价值新跃迁