我有一个名为test.csv的csv文件,其中包含以下内容:
d,t,s,A,B
2021293,010000,.189545,-9.3868122,46.152637
2021293,010000,.388550,-9.3991013,46.22963
2021293,010000,.588547,-9.350419,46.189907
2021293,010000,.788544,-9.3768988,46.166893
2021293,010000,.988541,-9.3335829,46.134583
2021293,010001,.188538,-9.3287783,46.233955
2021293,010001,.388550,-9.3323059,46.203461
2021293,010001,.588547,-9.2911615,46.19883
2021293,010001,.788544,-9.322463,46.135742
2021293,010001,.988541,-9.2798738,46.236137
当我运行以下代码时:
import numpy as np
import pandas as pd
csv_filename = 'test.csv'
hdf_filename = 'test.h5'
csv_data = pd.read_csv(csv_filename )
data = pd.DataFrame.transpose(csv_data)
data.to_hdf(hdf_filename, key='foobar/data', mode='w', format='fixed')
然后通过load test.h5
检查octave
或matlab
中的hdf5文件,我在foobar.data
下看到
ans =
1x1 struct array containing the fields:
axis0
axis1
block0_items
block0_values
但是,将使用hdf5文件的员工希望foobar.data.block0_values
的内容可以直接在foobar.data
中使用,而不必遍历foobar.data.block0_values
。我该如何改变这一点?
foobar.data.block0_values
的内容是
foobar.data.block0_values
ans =
2021293 10000 0.189545 -9.3868122 46.152637
2021293 10000 0.38855 -9.3991013 46.22963
2021293 10000 0.588547 -9.350419 46.189907
2021293 10000 0.788544 -9.376898799999999 46.166893
2021293 10000 0.988541 -9.3335829 46.134583
2021293 10001 0.188538 -9.3287783 46.233955
2021293 10001 0.38855 -9.3323059 46.203461
2021293 10001 0.588547 -9.291161499999999 46.19883
2021293 10001 0.788544 -9.322463000000001 46.135742
2021293 10001 0.988541 -9.279873800000001 46.236137
而我希望这些内容能直接在foobar.data
中出现。
发布于 2021-10-22 16:40:57
HDF5是一个容器,而不是一个固定的格式。每个软件包都可以根据自己的需要自由地实现HDF5模式。因此,您必须了解每个包所需的HDF5模式。根据我使用Pandas的有限经验,HDF5数据总是使用您看到的模式编写的(数据集的名称为:axis0, axis1, block0_items, block0_values
,有时也称为block1_items, block1_values
)。如果文件需要在matlab
和/或octave
中工作,则需要确定他们在读取HDF5数据时所需的模式。
HDF5有两种基本数据集类型:
所有值都具有相同类型的
ints
、floats
或strings
。这看起来像是Pandas.数据的“挑战”是整数和浮点数的混合。这意味着您的HDF5模式有两种可能的方法:
ints
和dataset2中的floats
创建同构数据集(外加一些要重组的信息)。这就是Pandas approach.PyTables
或h5py
包完成此操作。关键是从数据帧数据类型创建NumPy重新数组,然后将数据帧值加载到重新数组中。根据以前的HDF5经验,我“相当肯定”matlab可以像您预期的那样读取这种格式。此示例说明如何使用这两个包创建异构数据集。唯一真正的区别是创建数据集的函数调用。(注意: Pandas使用PyTables访问HDF5,因此可能已经安装了Pandas --但您必须进行验证。)
将以下几行添加到您的示例中,以查看其工作原理:
# extract column names and dtypes to create the recarray dtype
arr_dt = []
for col in csv_data.columns:
arr_dt.append( (col, csv_data[col].dtype) )
nrows = csv_data.values.shape[0]
# create an empty recarray based on Pandas dataframe row count and dtype
arr = np.empty( (nrows,), dtype=arr_dt )
# load dataframe column values into the recarray fields
for col in csv_data.columns:
arr[col] = csv_data[col].values
print(arr)
# use PyTables to write recarray to h5 file
import tables as tb
with tb.File(hdf_filename, mode='a') as h5f:
h5f.create_table('/tb','csv_data',obj=arr,createparents=True)
# use h5py to write recarray to h5 file
import h5py
with h5py.File(hdf_filename, mode='a') as h5f:
h5f.create_dataset('h5py/csv_data',data=arr)
https://stackoverflow.com/questions/69669249
复制相似问题