我的csv数据非常大。看起来像这样。
[日期,公司名称,值1,值2,...,值60]
我想将其转换为hdf5文件。例如,假设我有两个日期(2019-07-01,2019-07-02),每个日期都有3个公司(公司1,公司2,公司3),每个公司都有[值1,值2,...。 ..值60]。
我想使用日期和公司名称作为一个组。具体来说,我要使用以下层次结构:“日期/公司名称”。
例如,2019-07-01具有公司1,公司2和公司3。当您查看每家公司时,有很多[值1,值2,...值60] s。
有什么想法吗?
谢谢。
答案 0 :(得分:0)
有很多方法可以解决此问题。在显示一些代码之前,有一个建议:仔细考虑您的数据架构。这很重要。这将影响您访问和使用数据的难易程度。例如,您建议的模式使在一个日期访问一个公司的数据变得容易。如果您想要一个公司在一定日期范围内的所有数据怎么办?还是您希望某一天所有公司的所有数据?两者都将要求您在访问数据后操纵多个阵列。
尽管直观,但您可能希望将CSV数据存储为单个组/数据集。我将在下面的2种方法中展示每种方法的示例。以下两种方法都使用printmsg
来读取CSV数据。可选参数np.genfromtxt
将从CSV文件的第一行读取标头(如果有)。如果没有标题行,则省略names=True
,您将获得默认的字段名称(names=
。我的示例数据包含在末尾。
方法1:使用h5py
组名:日期
数据集名称:公司
f1, f2, f3, etc)
方法2:使用PyTables
所有存储在数据集中的数据:/ CSV_Data
import numpy as np
import h5py
csv_recarr = np.genfromtxt('SO_57120995.csv',delimiter=',',dtype=None, names=True, encoding=None)
print (csv_recarr.dtype)
with h5py.File('SO_57120995.h5','w') as h5f :
for row in csv_recarr:
date=row[0]
grp = h5f.require_group(date)
firm=row[1]
# convert row data to get list of all valuei entries
row_data=row.item()[2:]
h5f[date].create_dataset(firm,data=row_data)
示例数据:
import numpy as np
import tables as tb
csv_recarr = np.genfromtxt('SO_57120995.csv',delimiter=',',dtype=None, names=True, encoding=None)
print (csv_recarr.dtype)
with tb.File('SO_57120995_2.h5','w') as h5f :
# this should work, but only first string character is loaded:
#dset = h5f.create_table('/','CSV_Data',obj=csv_recarr)
# create empty table
dset = h5f.create_table('/','CSV_Data',description=csv_recarr.dtype)
#workaround to add CSV data one line at a time
for row in csv_recarr:
append_list=[]
append_list.append(row.item()[:])
dset.append(append_list)
# Example to extract array of data based on field name
firm_arr = dset.read_where('Firm==b"Firm1"')
print (firm_arr)