(本题已被原作者修改,示例代码已修改,以便您可以在自己的机器上运行)
我正在将时间序列数据加载到 pytables 中(在这个测试用例中,大约 200 万行,23 列主要是浮点值)。我还想在同一个 pytable 文件中创建一个相应的表,该表具有相同的行数和列数以及列名,但使用 int8 数据类型作为质量控制“掩码”。为此,我从数据表中检索列名和行计数信息,并使用它来创建用于创建/附加到质量控制 pytable 表的 numpy 零记录数组。
当我将 numpy 零记录数组附加到新的“掩码”pytable 时,就会出现问题。即使用于创建/附加到 pytable 的 numpy 零记录数组是正确的大小 - 生成的 pytable 比预期的要大得多 - pytable 中的更多行然后已从 numpy recarray 附加。
以下可运行的示例代码演示了该问题。它创建了一个 pytable 并将 numpy 零重新数组附加到表中,期望创建一个表,其中包含“nrows”的零值记录。使用 Vitables 查看时,生成的 pytable 的行数比预期的多
我不确定这些额外的数据行来自哪里?任何建议,将不胜感激。
使用 python 2.7.2、pytables 2.3.1、numpy 1.6.1.1
import tables
import numpy as np
import string as str
Storename = 'Test.h5'
Storetitle = 'Test'
PathList = ['Lvl0','Lvl1']
Tablename = 'Data'
storeq = tables.openFile(Storename, mode='a', title= Storetitle)
for ix, agroup in enumerate(PathList):
mypath0 = '/'+str.strip('/'.join(PathList[0:ix]))
mypath1 = '/'+str.strip('/'.join(PathList[0:ix+1]))
try:
storeq.getNode(mypath1)
except(tables.exceptions.NoSuchNodeError):
storeq.createGroup(mypath0,PathList[ix])
pathq = mypath1
qtable = None
tfields = ['DateTime','f0','f1','f2','f3','f4','f5','f6','f7','f8','f9']
nfields = 11
tformats = ['int64', 'int8', 'int8', 'int8', 'int8', 'int8',
'int8', 'int8', 'int8', 'int8', 'int8']
nrows = 2122387
rowchunk = 100000
rowsteps, rowrem = divmod(nrows, rowchunk)
for ix in range(rowsteps):
fillarray = np.zeros((rowchunk,nfields), {'names': tfields, 'formats': tformats})
if qtable==None:
print('create')
qtable = storeq.createTable(pathq, Tablename, fillarray)
qtable.flush()
else:
print('append :', ix, fillarray.shape)
qtable.append(fillarray)
qtable.flush()
if rowrem > 0:
fillarray = np.zeros((rowrem,nfields), {'names': tfields, 'formats': tformats})
if ix == 0:
print('create')
qtable = storeq.createTable(pathq,Tablename, fillarray)
qtable.flush()
else:
print('append :', rowrem, fillarray.shape)
qtable.append(fillarray)
qtable.flush()
qtable.close()
storeq.close()
以下是将 numpy 零重新数组写入质量控制 pytable 时创建的打印语句输出。
create
('append :', 1, (100000, 26))
('append :', 2, (100000, 26))
('append :', 3, (100000, 26))
('append :', 4, (100000, 26))
('append :', 5, (100000, 26))
('append :', 6, (100000, 26))
('append :', 7, (100000, 26))
('append :', 8, (100000, 26))
('append :', 9, (100000, 26))
('append :', 10, (100000, 26))
('append :', 11, (100000, 26))
('append :', 12, (100000, 26))
('append :', 13, (100000, 26))
('append :', 14, (100000, 26))
('append :', 15, (100000, 26))
('append :', 16, (100000, 26))
('append :', 17, (100000, 26))
('append :', 18, (100000, 26))
('append :', 19, (100000, 26))
('append :', 20, (100000, 26))
('append :', 22387, (22387, 26))