Как найти индексы в таблице с датами?

У меня есть таблица с датами d:

               created_at
0     2020-01-01 18:08:09
1     2020-02-10 23:45:40
2     2020-02-20 09:41:14
3     2020-03-10 13:44:40

Необходимо найти индексы дат, которые больше date_1 и меньше date_2.

import numpy as np
import pandas as pd
import datetime

date_1 = datetime.datetime(2020, 02, 10, hour=0, minute=0, second=0, tzinfo=None)
date_2 = datetime.datetime(2020, 03, 10, hour=0, minute=0, second=0, tzinfo=None)

ind = np.where((d >= date_1) & (d < date_2))[0]
print(ind)

Ожидаемый результат:

[1, 2]

Но появляется ошибка:

TypeError: '>=' not supported between instances of 'str' and 'datetime.datetime'. 

Не совсем понятно, нужно ли переводить таблицу дат из str в формат даты?


Ответы (3 шт):

Автор решения: Sergey

Как-то так:

from datetime import datetime
import numpy as np


d = np.array([
    datetime.strptime('2020-01-01 18:08:09', '%Y-%m-%d %H:%M:%S'),
    datetime.strptime('2020-02-10 23:45:40', '%Y-%m-%d %H:%M:%S'),
    datetime.strptime('2020-02-20 09:41:14', '%Y-%m-%d %H:%M:%S'),
    datetime.strptime('2020-03-10 13:44:40', '%Y-%m-%d %H:%M:%S')
])


date_1 = datetime(2020, 2, 10, hour=0, minute=0, second=0, tzinfo=None)
date_2 = datetime(2020, 3, 10, hour=0, minute=0, second=0, tzinfo=None)

ind = np.where((d >= date_1) & (d < date_2))[0]
print(ind)

[1 2]
→ Ссылка
Автор решения: CrazyElf

Если d это таблица Pandas, то так:

ind = d.loc[(d['created_at'] >= date_1) & (d['created_at'] < date_2)].index

Но вообще да, даты наверное нужно будет перевести через pd.to_datetime.

→ Ссылка
Автор решения: MaxU

Можно воспользоваться методом DataFrame.query:

d['created_at'] = pd.to_datetime(d['created_at'])
idx = d.query('@date_1 < created_at < @date_2').index
→ Ссылка