如何复制指定HDF5结构保存天文数据(从Pandas DataFrame出发)
问题描述
我有如下格式的天文数据:
M200c, M200m, dec, ra 19.4, 20.4, 1.33, 4.68 ...
需要将其保存为HDF5格式以适配指定脚本。已知目标HDF5的结构来自示例文件,结构如下:
import nexusformat.nexus as nx f = nx.nxload('example_input_file.hdf5') print(f.tree) >>> root:NXroot >>> Data:NXgroup >>> M200c = float32(735697) >>> M200m = float32(735697) >>> dec = float32(735697) >>> ra = float32(735697)
我尝试将数据加载到Pandas DataFrame后用以下代码保存:
import pandas as pd df ... # 数据加载与处理步骤 df.to_hdf('my_data_input_file.hdf5', key='df', mode='w')
但Pandas生成的HDF5结构复杂且不符合要求,导致脚本报错:KeyError: Unable to open object (component not found)。
请问是否有工具/包可以复制示例HDF5的结构并保存数据?或者提供硬编码方案,比如循环列名填充空HDF5?我刚接触该格式,求指导。
解决方案
方案1:使用nexusformat包(推荐,匹配示例结构)
因为示例文件本身是用nexusformat读取的,直接用这个包构建结构最贴合需求:
import nexusformat.nexus as nx import pandas as pd # 1. 加载数据到DataFrame df = pd.read_csv('your_data.csv') # 替换为你的数据文件路径 # 2. 创建NXroot和Data组 root = nx.NXroot() root['Data'] = nx.NXgroup() # 3. 将DataFrame的列转换为float32类型并写入对应组 for col in ['M200c', 'M200m', 'dec', 'ra']: # 转换为float32,匹配示例中的数据类型 data = df[col].astype('float32').values root['Data'][col] = data # 4. 保存HDF5文件 nx.nxsave('my_data_input_file.hdf5', root, mode='w')
这段代码会完全复刻示例中的结构:根节点是NXroot,下一级是Data组,组内包含四个float32类型的数据集。
方案2:使用h5py硬编码构建结构
如果你不想依赖nexusformat,可以用更底层的h5py包手动构建结构:
import h5py import pandas as pd # 1. 加载数据 df = pd.read_csv('your_data.csv') # 2. 创建HDF5文件并构建结构 with h5py.File('my_data_input_file.hdf5', 'w') as f: # 创建Data组 data_group = f.create_group('Data') # 循环写入每个列,指定数据类型为float32 for col in ['M200c', 'M200m', 'dec', 'ra']: data = df[col].astype('float32').values data_group.create_dataset(col, data=data, dtype='f4') # f4对应float32
验证结构是否正确
可以用nexusformat或者h5py读取生成的文件验证:
# 用nexusformat验证 import nexusformat.nexus as nx f = nx.nxload('my_data_input_file.hdf5') print(f.tree)
输出应该和示例的结构完全一致。
内容的提问来源于stack exchange,提问作者NeStack
相关产品推荐
相关产品推荐

