如何使用h5py写入.mat-v7.3文件?

1 投票
1 回答
20 浏览
提问于 2025-04-13 14:56

我已经能够使用 hdf5storage 来写 .mat-v7.3 文件,这得益于我阅读了关于 如何从Python使用hdf5storage创建.mat v7.3文件 的回答。不过,我相信我可以通过在写 .mat 文件时设置正确的头信息来实现相同的效果。

假设我有一个由以下数据构建的 Pandas 数据框:

[
 {'time': 0, 'sig0': 0.6153857, 'sig1': 0.070254125, 'sig2': 0.025843188}, 
 {'time': 586576558, 'sig0': 0.6015989, 'sig1': 0.7131938, 'sig2': 0.42542282},
...
 {'time': 589999558, 'sig0': 0.1598977, 'sig1': 0.6131938, 'sig2': 0.88882282}
]

我该如何解析这些数据,并创建一个与 .mat-v7.3 兼容的 hdf5 文件呢?

1 个回答

1

如果你去看看 hdf5storage的GitHub页面,你会发现一些头部信息是在 这里 定义的。里面提到你需要一个512字节的元数据块,这个块里包含了一些信息,比如创建时间、平台版本、字符编码等等。

接下来,你只需要根据你的数据框(dataframe)中的列来创建数据集。下面是一个将这两个步骤结合起来的例子:

import datetime
import h5py
import pandas as pd
import sys

data = [
    {'time': 0, 'sig0': 0.6153857, 'sig1': 0.070254125, 'sig2': 0.025843188},
    {'time': 586576558, 'sig0': 0.6015989, 'sig1': 0.7131938, 'sig2': 0.42542282},
    {'time': 589999558, 'sig0': 0.1598977, 'sig1': 0.6131938, 'sig2': 0.88882282}
]
df = pd.DataFrame(data)

def mat_export(df, export_path):
    def write_userblock(filename):
        now = datetime.datetime.now()
        v = sys.version_info
        platform_version = f"CPython {v.major}.{v.minor}.{v.micro}"
        created_on = now.strftime("%a %b %d %H:%M:%S %Y")
        header = f"MATLAB 7.3 MAT-file, Platform: {platform_version}, Created on: {created_on} HDF5 schema 1.00 ."
        header_bytes = bytearray(header, "utf-8")
        header_bytes.extend(bytearray((128 - 12 - len(header_bytes)) * " ", "utf-8"))
        header_bytes.extend(bytearray.fromhex("00000000 00000000 0002494D"))
        with open(filename, "r+b") as f:
            f.write(header_bytes)

    def write_h5py(data, filename, userblock_size=512):
        with h5py.File(filename, "w", userblock_size=userblock_size) as f:
            pass  # Close to write the userblock
        write_userblock(filename)
        with h5py.File(filename, "a") as f:
            for column in data.columns:
                f.create_dataset(column, data=data[column], maxshape=(None,), chunks=True)

    write_h5py(df, export_path)

export_path = 'your_data.mat'
mat_export(df, export_path)

就这样,希望这个问答能帮助那些想用Python导出与.mat文件兼容的hdf5文件的人。

撰写回答