У меня есть большие пандыDataFrame
DatetimeIndex: 3425100 entries, 2011-12-01 00:00:00 to 2011-12-31 23:59:59
Data columns:
sig_qual 3425100 non-null values
heave 3425100 non-null values
north 3425099 non-null values
west 3425097 non-null values
dtypes: float64(4)
Я выбираю подмножество этого DataFrame
с помощью .ix[start_datetime:end_datetime]
и передаю его функции обнаружения пиков , которая возвращает индекс и значение локальных максимумов и минимумов в двух отдельных списках. Я извлекаю положение индекса максимумов и, используя DataFrame.index
, получаю список временных меток pandas.
Затем я пытаюсь извлечь соответствующее подмножество большого DataFrame, передав список TimeStamps в .ix[]
, но он всегда возвращает пустой DataFrame
. Я могу просмотреть список временных меток и получить соответствующие строки из DataFrame
, но это длительный процесс, и я подумал, что ix[]
должен принимать список значений в соответствии с документами ?(Хотя я вижу, что в примере для Pandas 0.7 используется numpy.ndarray
изnumpy.datetime64
)
Обновление: Небольшое 8-секундное подмножество DataFrame выбрано ниже, строки #показывают некоторые значения:
y = raw_disp['heave'].ix[datetime(2011,12,30,0,0,0):datetime(2011,12,30,0,0,8)]
#csv representation of y time-series
2011-12-30 00:00:00,-310.0
2011-12-30 00:00:01,-238.0
2011-12-30 00:00:01.500000,-114.0
2011-12-30 00:00:02.500000,60.0
2011-12-30 00:00:03,185.0
2011-12-30 00:00:04,259.0
2011-12-30 00:00:04.500000,231.0
2011-12-30 00:00:05.500000,139.0
2011-12-30 00:00:06.500000,55.0
2011-12-30 00:00:07,-49.0
2011-12-30 00:00:08,-144.0
index = y.index
[2011-12-30 00:00:00,..., 2011-12-30 00:00:08]
Length: 11, Freq: None, Timezone: None
#_max returned from the peakdetect function, one local maxima for this 8 seconds period
_max = [[5, 259.0]]
indexes = [x[0] for x in _max]
#[5]
timestamps = [index[z] for z in indexes]
#[]
print raw_disp.ix[timestamps]
#Empty DataFrame
#Columns: array([sig_qual, heave, north, west, extrema], dtype=object)
#Index:
#Length: 0, Freq: None, Timezone: None
for timestamp in timestamps:
print raw_disp.ix[timestamp]
#sig_qual 0
#heave 259
#north 27
#west 132
#extrema 0
#Name: 2011-12-30 00:00:04
Обновление 2:
Я создал суть ,что на самом деле работает, потому что, когда данные загружаются из csv, индексные столбцы временных меток сохраняются в виде массива объектов, которые выглядят как строки. В отличие от моего собственного кода, где индекс имеет тип
и каждый элемент имеет тип
, я думал, что передача списка pandas.lib.Timestamp
будет работать так же, как передача отдельных временных меток, будет ли это считаться ошибкой?
Если я создаю исходный DataFrame
с индексом в виде списка строк, запрос со списком строк работает нормально. Однако это значительно увеличивает размер байта DataFrame.
Обновление 3: Ошибка возникает только с очень большими фреймами данных. Я перезапустил код для различных размеров фрейма данных (, некоторые подробности в комментарии ниже ), и похоже, что это происходит в фрейме данных с более чем 2,7 миллионами записей. Использование строк вместо меток времени решает проблему, но увеличивает использование памяти.
Фиксированный В последнем мастере github (от 18 сентября 2012 г. ), см. комментарий Уэса внизу страницы.