如何从.hdf5文件BlinkStartEvent表提取列名并按列名访问行数据
错误原因
f[dset]是h5py的Dataset实例,该对象本身没有keys()方法。你存储的数据集是结构化NumPy数组,列名存储在数据集的dtype属性的names字段中,你之前打印的Data type输出里的元组第一个元素就是列名。

提取列名的实现
直接读取dtype.names即可拿到列名列表,修改对应代码段如下:
with h5py.File(filenameHDF[0], 'r') as f: for dset in traverse_datasets(f): if str(dset[-15:]) == 'BlinkStartEvent': print('-----Path:', dset) print('-----Shape:', f[dset].shape) print('-----Data type:', f[dset].dtype) # 提取列名列表 col_names = f[dset].dtype.names print('列名列表:', col_names) data2 = f[dset][()]
高效访问数据的方式
你读取到的data2本身就是NumPy结构化数组,天然支持你想要的访问语法,不需要额外构建字典:
- 按行+列名取值/赋值:
data2[0]['experiment_id'] = 1、data2[1]['time'] = 78.35161可以直接使用 - 按列名批量取数:
data2['time']会返回所有行的time字段组成的数组,效率远高于逐行遍历
如果确实需要转换为字典格式,可使用以下两种快速转换方法:
# 转换为{列名: 整列值数组}格式的字典,适合批量按列操作 col_dict = {col: data2[col] for col in col_names} # 转换为逐行字典组成的列表,每个元素对应一行数据的字典 row_dict_list = data2.tolist()
如果数据集体积较大不需要全量加载到内存,也可以不用一次性读取f[dset][()],直接通过f[dset][行索引, 列名]的方式按需访问数据,内存占用更低。
内容的提问来源于stack exchange,提问作者Ang Jit Wei Aaron
相关产品推荐
相关产品推荐

