Поиск позиций строки по индексу datetime в pandas кадре данных - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть фрейм данных с датой DateTimeIndex и массивом X 2d numpy, который является просто значениями этого фрейма данных. Я хочу выделить несколько строк в индексе кадра данных

dataset[from_d:to_d]

Где from_d и to_d - метки времени. Набор данных нарезан очень хорошо, но мне нужно получить позиции этих строк внутри набора данных. Я нуждаюсь в них, потому что тогда я хочу выбрать те же строки в массиве X numpy. Что-то вроде

X[indexes]

Я пробовал np.where(dataset[from_d:to_d])[0], но это дает мне массив (23149590,), когда набор данных имеет форму: (15075, 13117). Есть ли лучший способ сделать это, чем где?

1 Ответ

2 голосов
/ 14 февраля 2020

Использование Index.get_indexer:

rng = pd.date_range('2017-04-03', periods=10)
dataset = pd.DataFrame({'a': range(10)}, index=rng)  
print (dataset)
            a
2017-04-03  0
2017-04-04  1
2017-04-05  2
2017-04-06  3
2017-04-07  4
2017-04-08  5
2017-04-09  6
2017-04-10  7
2017-04-11  8
2017-04-12  9

from_d = '2017-04-05'
to_d = '2017-04-10'
print (dataset[from_d:to_d])
            a
2017-04-05  2
2017-04-06  3
2017-04-07  4
2017-04-08  5
2017-04-09  6
2017-04-10  7

indexes = dataset.index.get_indexer(dataset[from_d:to_d].index)
print (indexes)
[2 3 4 5 6 7]

Или Index.searchsorted:

indexes = dataset.index.searchsorted(dataset[from_d:to_d].index)
print (indexes)
[2 3 4 5 6 7]

РЕДАКТИРОВАТЬ:

Для не уникального DatetimeIndex это возможно с уникальным индексом и Index.get_indexer_for:

rng = pd.date_range('2017-04-03', periods=10) 
dataset = pd.DataFrame({'a': range(20)}, index=rng.append(rng)).sort_index()
print (dataset)
             a
2017-04-03   0
2017-04-03  10
2017-04-04   1
2017-04-04  11
2017-04-05   2
2017-04-05  12
2017-04-06   3
2017-04-06  13
2017-04-07   4
2017-04-07  14
2017-04-08   5
2017-04-08  15
2017-04-09   6
2017-04-09  16
2017-04-10  17
2017-04-10   7
2017-04-11  18
2017-04-11   8
2017-04-12   9
2017-04-12  19

from_d = '2017-04-05'
to_d = '2017-04-10'

i = dataset[from_d:to_d].index.unique()
print (i)
DatetimeIndex(['2017-04-05', '2017-04-06', '2017-04-07', '2017-04-08',
               '2017-04-09', '2017-04-10'],
              dtype='datetime64[ns]', freq=None)

indexes = dataset.index.get_indexer_for(i)
print (indexes)
[ 4  5  6  7  8  9 10 11 12 13 14 15]

Проверка индексов:

print (dataset.iloc[indexes])
             a
2017-04-05   2
2017-04-05  12
2017-04-06   3
2017-04-06  13
2017-04-07   4
2017-04-07  14
2017-04-08   5
2017-04-08  15
2017-04-09   6
2017-04-09  16
2017-04-10  17
2017-04-10   7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...