Поиск PyTables в ядре на Time64Col

Я использую PyTables 2.4.0 и Python 2.7. У меня есть база данных, содержащая следующую типичную таблицу:

/anc/asc_wind_speed (Table(87591,), shuffle, blosc(3)) 'Wind speed'
  description := {
  "value_seconds": Time64Col(shape=(), dflt=0.0, pos=0),
  "update_seconds": Time64Col(shape=(), dflt=0.0, pos=1),
  "status": UInt8Col(shape=(), dflt=0, pos=2),
  "value": Float64Col(shape=(), dflt=0.0, pos=3)}
  byteorder := 'little'
  chunkshape := (2621,)
  autoIndex := True
  colindexes := {
    "update_seconds": Index(9, full, shuffle, zlib(1)).is_CSI=True,
    "value": Index(9, full, shuffle, zlib(1)).is_CSI=True}

Я заполняю столбцы меток времени, используя секунды с плавающей запятой.

Данные выглядят нормально в моем сеансе IPython:

array([(1343779432.2160001, 1343779431.8529999, 0, 5.2975000000000003),
       (1343779433.2190001, 1343779432.9430001, 0, 5.7474999999999996),
       (1343779434.217, 1343779433.9809999, 0, 5.8600000000000003), ...,
       (1343866301.934, 1343866301.5139999, 0, 3.8424999999999998),
       (1343866302.934, 1343866302.5799999, 0, 4.0599999999999996),
       (1343866303.934, 1343866303.642, 0, 3.7825000000000002)], 

  dtype=[('value_seconds', '<f8'), ('update_seconds', '<f8'), ('status', '|u1'), ('value', '<f8')])

.. но когда я пытаюсь выполнить поиск в ядре, используя индексированный столбец «update_seconds», все идет грушевидным образом:

len(wstable.readWhere('(update_seconds <= 1343866303.642)'))
0

т.е. я получаю 0 строк, когда я ожидал всех 87591 из них. Иногда мне удается получить некоторые строки с запросом '>=', но столбцы временных меток возвращаются в виде огромных чисел с плавающей запятой (~ 10 ^ 79). Похоже, происходит какое-то неявное преобразование типов, из-за которого значения Time64Col неправильно интерпретируются. Может ли кто-нибудь заметить мою ошибку, или я должен забыть о Time64Cols и преобразовать их все в Float64 (и как мне это сделать?)


person ProfCalculus    schedule 15.04.2013    source источник


Ответы (1)


Это связано с тем, что Time64 является специальной структурой типа C (см. time.h). Пока используйте Float64Col. См. следующую проблему: https://github.com/PyTables/PyTables/issues/230

person Anthony Scopatz    schedule 24.04.2013