(этот вопрос был изменен первоначальным автором, а пример кода изменен, чтобы вы могли запустить его на своем компьютере)
Я загружаю данные временных рядов в pytables (~ 2 миллиона строк, 23 столбца в основном с плавающей запятой в этом тестовом примере). Я также хотел бы создать соответствующую таблицу в том же файле pytable с тем же количеством строк, столбцов и имен столбцов, но с типами данных int8, которые будут использоваться в качестве «маски» контроля качества. Для этого я извлекаю имена столбцов и информацию о количестве строк из таблицы данных и использую это для создания массивов нулевых записей, которые используются для создания/добавления к таблице pytable контроля качества.
Проблема возникает, когда я добавляю массивы нулевых записей numpy к новой «маске» pytable. Несмотря на то, что массивы нулевых записей numpy, которые используются для создания/добавления к pytable, имеют правильный размер, результирующая pytable значительно больше, чем ожидалось, с большим количеством строк в pytable, которые были добавлены из numpy recarray.
Следующий исполняемый пример кода демонстрирует проблему. Он создает pytable и добавляет нулевые повторные записи в таблицу с ожиданием создания таблицы с «nrows» записей с нулевыми значениями. Полученная таблица pytable содержит больше строк, чем ожидалось, при просмотре с помощью Vitables.
Я не уверен, откуда берутся эти дополнительные строки данных? Мы ценим любые предложения.
Использование 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()
Ниже приведен вывод оператора печати, созданный, когда нулевые повторные записи записываются в таблицу контроля качества 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))