Python 使用chunksize在HDFStore上迭代,并保存到新的HDFStore中

Python 使用chunksize在HDFStore上迭代,并保存到新的HDFStore中,python,pandas,pytables,Python,Pandas,Pytables,我把我所有的数据都放进了HDFStore(是的!),但如何从中取出 我已将6个数据帧保存为HDFStore中的frame_表。这些表格看起来如下所示,但长度不同(日期为朱利安日期) 然后,我从所有表格中选择日期大于2006256的值 >>> b = store.select_as_multiple(['var1','var2','var3','var4','var5','var6'], where=(pd.Term('date','>',date)), selector=

我把我所有的数据都放进了HDFStore(是的!),但如何从中取出

我已将6个数据帧保存为HDFStore中的frame_表。这些表格看起来如下所示,但长度不同(日期为朱利安日期)

然后,我从所有表格中选择日期大于2006256的值

>>> b = store.select_as_multiple(['var1','var2','var3','var4','var5','var6'], where=(pd.Term('date','>',date)), selector= 'var1')
>>> b.head()
                      var1   var2  var3  var4  var5  var6
x_coor y_coor date                                        
928    310    2006257   133  14987  7045    18   240   171
              2006273   136      0  7327    30   253   161
              2006289   125      0  -239    83   217   168
              2006305    95  14604  6786    13   215    57
              2006321    84      0  4548    13   133    88
这是可行的,但只适用于相对较小的.h5文件。因此,对于我的普通.h5文件,我希望使用chunksize将其临时存储在HDFStore中(因为我还需要根据此选择向其添加一个新列)。我这样想(使用):

但是只有一个块被添加到存储中。但是:

tempstore.append('test',pd.DataFrame(df))

I get ValueError:只能附加到表。我做错了什么?

当您尝试使用
put
执行此操作时,它不断覆盖存储(使用最新的块),然后在追加时出现错误(因为您无法追加到storer/non表)

即:

  • 编写一个单一的、不可追加的固定格式(称为
    storer
    ),该格式编写速度快,但不能追加,也不能查询(只能完整地获取)

  • 创建一个
    表格
    格式,这就是您在这里想要的格式(以及
    框架表格
    的格式)

注意:您不需要执行pd。数据帧(df)因为
df
已经是一个帧

因此,如果存在以下情况,请首先执行此操作(删除存储):

if 'test' in tempstore:
    tempstore.remove('test')
然后附加每个数据帧:

for df in store.select_as_multiple(.....):
     tempstore.append('test', df)

感谢您提供的宝贵信息。但还没有完全解决我的问题。由于它引发了以下错误“ValueError:values\u axes]在追加数据[name->values\u block\u 0,cname->values\u block\u 0,axis->None,pos->1,kind->float]时与当前表[name->values\u block\u 0,cname->values\u block\u 0,axis->None,pos->1,kind->integer]的[values]组合无效”,我的数据是int32,但它试图将其存储为float。为什么它不复制数据结构?如果使用更大的块大小会发生什么?仅供参考默认chunksize为50kMy数据只包含int32值,但在迭代器中引入了NaN值(我不知道为什么),但不在第一个块中。因此,第一个区块存储为整数,第二个区块中获取NaN值,而store无法将NaN转换为整数将chunksize增加到50k,因为我的testdataset只包含203个值。而且输出存储不再包含NaN值。是的,有时按块存储会出现问题。很高兴它成功了
if 'test' in tempstore:
    tempstore.remove('test')
for df in store.select_as_multiple(.....):
     tempstore.append('test', df)