Выбор подмножества Pandas DataFrame, индексированного DatetimeIndex, со списком меток времени

У меня есть большие панды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 г. ), см. комментарий Уэса внизу страницы.

12
задан piRSquared 5 January 2017 в 00:35
поделиться