Pandas 在我年老去世之前尝试加载带有dataframe.to_hdf的hdf5表

Pandas 在我年老去世之前尝试加载带有dataframe.to_hdf的hdf5表,pandas,hdf5,pytables,Pandas,Hdf5,Pytables,这听起来应该很容易用谷歌来回答,但我发现用这种方式来回答我的大多数重要问题是不可能的。我所要做的就是将来自6000个不同CSV文件的大约30亿条记录加载到一个HDF5文件中的一个表中。这是一个简单的表,26个字段,混合了字符串、浮点和整数。我正在用df=pandas.read_csv()加载csv,并用df.to_hdf()将它们附加到我的hdf5文件中。我真的不想使用df.to\u hdf(data\u columns=True),因为它看起来需要大约20天,而df.to\u hdf(data

这听起来应该很容易用谷歌来回答,但我发现用这种方式来回答我的大多数重要问题是不可能的。我所要做的就是将来自6000个不同CSV文件的大约30亿条记录加载到一个HDF5文件中的一个表中。这是一个简单的表,26个字段,混合了字符串、浮点和整数。我正在用
df=pandas.read_csv()
加载csv,并用
df.to_hdf()
将它们附加到我的hdf5文件中。我真的不想使用
df.to\u hdf(data\u columns=True)
,因为它看起来需要大约20天,而
df.to\u hdf(data\u columns=False)
大约需要4天。但显然,当您使用
df.to\u hdf(data\u columns=False)
时,您会遇到一堆垃圾,甚至无法从中恢复表结构(或者在我未受过教育的眼睛看来是这样)。在hdf5表中,只有在min_itemsize列表中标识的列(4个字符串列)是可识别的,其余的列将按数据类型转储到
值块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块块

table = h5file.get_node('/tbl_main/table')
print(table.colnames)
['index', 'values_block_0', 'values_block_1', 'values_block_2', 'values_block_3', 'values_block_4', 'str_col1', 'str_col2', 'str_col3', 'str_col4']
任何查询,如
df=pd.DataFrame.from_记录(table.read_其中(条件))
都会失败,并出现错误“异常:数据必须是一维的”


所以我的问题是:(1)我真的必须使用花费5倍时间的
data\u columns=True
?我希望能快速加载,然后在加载表后只对几列进行索引。(2) 我使用
data\u columns=False得到的这堆垃圾到底是什么?如果我需要返回带有可查询列的表,这有什么好处吗?这对任何事情都有好处吗?

这就是使用pytables从CSV数据创建HDF5文件的方法。您还可以使用类似的过程来创建带有h5py的HDF5文件

  • 使用循环将带有
    np.genfromtxt
    的CSV文件读取到np数组中
  • 读取第一个CSV文件后,使用
    .create_table()
    方法写入数据,引用在步骤1中创建的np数组
  • 对于其他CSV文件,请使用
    .append()
    方法写入数据,引用在步骤1中创建的np数组
  • 循环结束
    于2019年6月2日更新以读取日期字段(mm/dd/yyyy)并转换为
    datetime
    对象。请注意对
    genfromtxt()
    参数的更改!使用的数据添加到更新代码的下面

    import numpy as np   
    import tables as tb
    from datetime import datetime
    csv_list = ['SO_56387241_1.csv', 'SO_56387241_2.csv' ]
    
    my_dtype= np.dtype([ ('a',int),('b','S20'),('c',float),('d',float),('e','S20') ])
    
    with tb.open_file('SO_56387241.h5', mode='w') as h5f:
    
    for  PATH_csv in csv_list:
        csv_data = np.genfromtxt(PATH_csv, names=True, dtype=my_dtype, delimiter=',', encoding=None)
        # modify date in fifth field 'e'   
        for row in csv_data :
            datetime_object = datetime.strptime(row['my_date'].decode('UTF-8'), '%m/%d/%Y' )
            row['my_date'] = datetime_object
    
        if h5f.__contains__('/CSV_Data') :
            dset = h5f.root.CSV_Data
            dset.append(csv_data)
    
        else:
            dset = h5f.create_table('/','CSV_Data', obj=csv_data)
    
        dset.flush()
    
    h5f.close()
    
    测试数据:

    SO_56387241_1.csv:
    my_int,my_str,my_float,my_exp,my_date
    0,zero,0.0,0.00E+00,01/01/1980
    1,one,1.0,1.00E+00,02/01/1981
    2,two,2.0,2.00E+00,03/01/1982
    3,three,3.0,3.00E+00,04/01/1983
    4,four,4.0,4.00E+00,05/01/1984
    5,five,5.0,5.00E+00,06/01/1985
    6,six,6.0,6.00E+00,07/01/1986
    7,seven,7.0,7.00E+00,08/01/1987
    8,eight,8.0,8.00E+00,09/01/1988
    9,nine,9.0,9.00E+00,10/01/1989
    
    
    SO_56387241_2.csv:
    my_int,my_str,my_float,my_exp,my_date
    10,ten,10.0,1.00E+01,01/01/1990
    11,eleven,11.0,1.10E+01,02/01/1991
    12,twelve,12.0,1.20E+01,03/01/1992
    13,thirteen,13.0,1.30E+01,04/01/1993
    14,fourteen,14.0,1.40E+01,04/01/1994
    15,fifteen,15.0,1.50E+01,06/01/1995
    16,sixteen,16.0,1.60E+01,07/01/1996
    17,seventeen,17.0,1.70E+01,08/01/1997
    18,eighteen,18.0,1.80E+01,09/01/1998
    19,nineteen,19.0,1.90E+01,10/01/1999
    

    嘿,dts!在任何人回答这个问题之前,这个问题需要相当多的编辑。最基本的规则之一是一次只问一个有重点的问题,所以你可能会因此而受到警告。此外,在一些较小的数据帧上显示一个正确且混乱的结果,将有助于任何读者了解如何提供帮助。。。pytables文档中应该很好地涵盖一些内容,但据我所知,还没有。我不确定pytbales dos为什么应该涵盖这些内容
    df.to\u hdf(data\u columns=True)
    False
    是一个函数。如果您所有的CSV文件都有相同的数据列,并且您只需要相同的HDF5文件,那么您可能应该跳过pandas,改用pytables或h5py。关于如何做到这两个方面,有很多答案。对,我站在正确的立场,应该说。我花了相当多的时间查看pytables以跳过dataframe read_csv步骤,但无法获得read_csv的速度以及read_csv在阅读时可以做的丰富功能。但是如果pytables快得多的话,我会满足于只吸收CSV,而不进行任何复杂的处理。所以,没有人知道关于df.to_hdf(data_columns=True和False)的任何信息?生命中最大的奥秘之一?我想告诉你我对之前一个问题的答案。然后我发现“问题是作者自愿删除的。”我找到了我的旧代码,并对其进行了修改,以解决您的多个CSV情况。请参阅下面的答案。这种方法看起来很有希望。。。比如说,我可以用genfromtxt代替read_csv来完成我所做的一切,而且它的速度可能达到我的预期。但是,由于无知,我无法理解如何读取字符串字段。而且,我不能在这里输入足够的字符来显示我在做什么。我想我会尝试编辑上面的原始帖子…不知道如何在编辑中添加我的代码。。。我该怎么做,就新主题“genfromtxt”开始一个新问题?取消这个问题,我第四次尝试像“| S10”这样的语法,它终于起作用了。现在我正在尝试找出字符串到int的转换器和日期转换…你说的“不能找出如何读取字符串字段”是什么意思?当您使用
    dtype=None
    时,
    genfromtxt
    应根据找到的数据自动神奇地创建数据类型。然后,
    create_table
    将使用np数组数据类型定义表字段数据类型。另外,请记住,您正在处理unicode对象。我不知道如果每行上有不同长度的字符串字段会发生什么。另外,如果您知道CSV文件格式,您可以在
    genfromtxt
    中定义数据类型和引用。我必须将数据类型定义为列表,否则早期CSV上的“猜测”将是后期CSV的错误大小。但即使我不需要这样做,dtype=None也会为字符串字段提供垃圾。目前,我放弃了所有的转换器,除了日期之外,我不想与任何一个转换器一起生活。