Подтвердить что ты не робот

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

У меня есть большой Pandas DataFrame

<class 'pandas.core.frame.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 TimeStamps.

Затем я пытаюсь извлечь соответствующее подмножество большого DataFrame, передав список TimeStamps на .ix[], но он всегда возвращает пустой DataFrame. Я могу перебрать список TimeStamps и получить соответствующие строки из DataFrame, но это длительный процесс, и я подумал, что ix[] должен принять список значений в соответствии с документы? (Хотя я вижу, что пример для Pandas 0.7 использует numpy.ndarray of numpy.datetime64)

Update: Ниже отображено небольшое 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
<class 'pandas.tseries.index.DatetimeIndex'>
[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]
#[<Timestamp: 2011-12-30 00:00:04>]

print raw_disp.ix[timestamps]
#Empty DataFrame
#Columns: array([sig_qual, heave, north, west, extrema], dtype=object)
#Index: <class 'pandas.tseries.index.DatetimeIndex'>
#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: I создал gist, который на самом деле работает, потому что, когда данные загружаются из csv, столбцы индекса временных меток хранятся в виде массива numpy объектов, которые кажутся строками. В отличие от моего собственного кода, где индекс имеет тип <class 'pandas.tseries.index.DatetimeIndex'>, и каждый элемент имеет тип <class 'pandas.lib.Timestamp'>, я думал, что передача списка pandas.lib.Timestamp будет работать так же, как передача отдельных временных меток, будет ли это считаться ошибкой?

Если я создаю исходный DataFrame с индексом в виде списка строк, запрос со списком строк отлично работает. Это значительно увеличивает размер байта DataFrame.

Обновление 3: Ошибка возникает только при очень больших DataFrames, я повторяю код на разных размерах DataFrame (некоторые подробности в комментарии ниже), и, похоже, это происходит на DataFrame выше 2,7 миллиона записей. Использование строк в отличие от TimeStamps устраняет проблему, но увеличивает использование памяти.

Fixed В последнем github master (18/09/2012), см. Комментарий от Wes внизу страницы.

4b9b3361

Ответ 1

df.ix [my_list_of_dates] должен работать нормально.

In [193]: df
Out[193]:
            A  B  C  D
2012-08-16  2  1  1  7
2012-08-17  6  4  8  6
2012-08-18  8  3  1  1
2012-08-19  7  2  8  9
2012-08-20  6  7  5  8
2012-08-21  1  3  3  3
2012-08-22  8  2  3  8
2012-08-23  7  1  7  4
2012-08-24  2  6  0  6
2012-08-25  4  6  8  1

In [194]: row_pos = [2, 6, 9]

In [195]: df.ix[row_pos]
Out[195]:
            A  B  C  D
2012-08-18  8  3  1  1
2012-08-22  8  2  3  8
2012-08-25  4  6  8  1

In [196]: dates = [df.index[i] for i in row_pos]

In [197]: df.ix[dates]
Out[197]:
            A  B  C  D
2012-08-18  8  3  1  1
2012-08-22  8  2  3  8
2012-08-25  4  6  8  1