Как найти индекс строки первого вхождения совпадения в ячейку в кадре данных Python (с датой) - PullRequest
0 голосов
/ 18 января 2019

У меня есть фрейм данных Python, содержащий столбец с датой и временем, как это 2019-01-02 09:00:00 (что означает 2 января 2019 9 утра)

В столбце Дата и время может быть несколько строк с одинаковой датой.

Другими словами, у меня может быть 2019-01-02 09:00:00 или 2019-01-02 09:15:00 или 2019-01-02 09:30:00 и т. Д.

Теперь мне нужно найти индекс строки первого вхождения даты 2019-01-02 во фрейме данных Python .

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

С помощью метода df['Date Time'].str.contains() я могу получить все строки, соответствующие данной дате, , но мне нужен индекс .

Общий вопрос заключается в том, как найти индекс первого вхождения совпадения в ячейке во фрейме данных Python, который соответствует заданному строковому шаблону.

Более конкретный вопрос состоит в том, что как мы можем найти индекс первого вхождения совпадения в ячейке во фрейме данных Python, который соответствует данной дате в ячейке, содержащей дату Время , предполагая, что Фрейм данных Python сортируется в хронологическом порядке возрастания даты и времени, т.е. 2019-01-02 09:00:00 происходит с индексом ранее 2019-01-02 09:15:00, затем 2019-01-03 09:00:00 и т. Д.

Спасибо за любые вклады

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Да, вы можете использовать .loc и условие, чтобы нарезать df, а затем вернуть индекс, используя .iloc.

import pandas as pd
df = pd.DataFrame({'time':pd.date_range(start='2018-01-01 00:00:00',end='2018-12-31 00:00:00', freq='H')}, index=None).reset_index(drop=True)

# then use conditions and .iloc to get the first instance
df.loc[df['time']>'2018-10-30 01:00:00'].iloc[[0,]].index[0]

# if you specify a coarser condition, for instance without time,
# it will also return the first instance
df.loc[df['time']>'2018-10-30'].iloc[[0,]].index[0]
0 голосов
/ 18 января 2019

Вы можете использовать next с iter для первого согласованного значения индекса, чтобы предотвратить ошибку, если не найдено соответствующих значений:

df = pd.DataFrame({'dates':pd.date_range(start='2018-01-01 20:00:00',
                                         end='2018-01-02 02:00:00', freq='H')})
print (df)
                dates
0 2018-01-01 20:00:00
1 2018-01-01 21:00:00
2 2018-01-01 22:00:00
3 2018-01-01 23:00:00
4 2018-01-02 00:00:00
5 2018-01-02 01:00:00
6 2018-01-02 02:00:00

date = '2018-01-02'
mask = df['dates'] >= date
idx = next(iter(mask.index[mask]), 'not exist')
print (idx)
4


date = '2018-01-08'
mask = df['dates'] >= date
idx = next(iter(mask.index[mask]), 'not exist')
print (idx)
not exist

Если важна производительность, см. Эффективно вернуть индекс первого значения, удовлетворяющего условию в массиве .

0 голосов
/ 18 января 2019

Не знаю, оптимально ли это, но работает

(df['Date Time'].dt.strftime('%Y-%m-%d') == '2019-01-02').idxmax()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...