我想在python中将非常大的csv数据转换为hdf5

时间:2019-07-20 00:56:22

标签: python hdf5 h5py pytables

我的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。

有什么想法吗?

谢谢。

1 个答案:

答案 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)