Как получить индексы строк в DataFrame с заданными значениями start и end?

У меня есть файл, который я загружаю в DataFrame. В одной из колонок находится список дат в формате: "%Y-%m-%d %H:%M" (например 2012.01.01 00:00) с интервалом в 30 минут.

У меня есть две даты (из тех, которые точно есть в этом DataFrame). Мне нужно выполнять определенные действия с теми данными, которые входят в промежуток от одной (начальной) даты до второй (конечной).

Например, я ввожу:

start = datetime.datetime.strptime('2012.05.07 00:00', '%Y.%m.%d %H:%M')
end = datetime.datetime.strptime('2012.07.12 23:30', '%Y.%m.%d %H:%M') 

Нужно получить индексы строк, в которых находятся эти даты, чтобы потом обрабатывать данные, которые входят в интервал от start до end.

Ссылка на файл с данными


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

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

Сначала читаем данные и параллельно парсим даты:

In [40]: df = pd.read_excel(filename, parse_dates=["date"], index_col=0)

Парсить даты можно и после прочтения:

df["date"] = pd.to_datetime(df["date"], errors="coerce")

получим:

In [41]: df
Out[41]:
                    date    T        dd  FF
0    2012-01-01 00:00:00  0.0       NaN   0
1    2012-01-01 00:30:00  0.0       NaN   0
2    2012-01-01 01:00:00  0.0       NaN   0
3    2012-01-01 01:30:00  0.0       С-З   1
4    2012-01-01 02:00:00  0.0       NaN   0
...                  ...  ...       ...  ..
1483 2012-12-31 21:30:00 -4.0  Западный   2
1484 2012-12-31 22:00:00 -5.0  Западный   3
1485 2012-12-31 22:30:00 -5.0  Западный   3
1486 2012-12-31 23:00:00 -5.0  Западный   4
1487 2012-12-31 23:30:00 -5.0  Западный   2

[17568 rows x 4 columns]

ищем индексы строк попадающих в интервал дат:


In [42]: idx = df.query("@start < date < @end").index

результат:

In [43]: idx
Out[43]:
Int64Index([289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
            ...
            565, 566, 567, 568, 569, 570, 571, 572, 573, 574],
           dtype='int64', length=3214)

Если нужны строки, а не соответствующие индексы:

In [44]: df.query("@start < date < @end")
Out[44]:
                   date     T          dd  FF
289 2012-05-07 00:30:00  15.0  Переменный   2
290 2012-05-07 01:00:00  15.0         NaN   0
291 2012-05-07 01:30:00  15.0         NaN   0
292 2012-05-07 02:00:00  16.0         С-З   3
293 2012-05-07 02:30:00  16.0    Северный   4
..                  ...   ...         ...  ..
570 2012-07-12 21:00:00  23.0         NaN   0
571 2012-07-12 21:30:00  23.0         NaN   0
572 2012-07-12 22:00:00  23.0         NaN   0
573 2012-07-12 22:30:00  22.0         NaN   0
574 2012-07-12 23:00:00  22.0         NaN   0

[3214 rows x 4 columns]
→ Ссылка