Вывод не полного фрейма данных

Всем привет) Данным кодом читаю базу данных :

import pandas as pd
import numpy as np
from datetime import datetime
import sqlite3
import pytz


timezone = pytz.timezone("Etc/UTC")
utc_from = datetime(2021, 9, 13, tzinfo=timezone)
base = sqlite3.connect('base_eurousd.db')
cur = base.cursor()

read_db = cur.execute('SELECT * FROM data_eurusd').fetchall()
df = pd.DataFrame(read_db)
# d = pd.read_sql("select * from data", db_conn)

df[0] = pd.to_datetime(df[0], unit='ms')
df[3] = np.where(df[1].diff().lt(0) | df[2].diff().lt(0), df[3] * -1, df[3])
print(df)

что выводит мне ::

                            0        1        2  3
0     2021-09-13 06:42:21.259  1.18059  1.18061  6
1     2021-09-13 06:42:23.265  1.18058  1.18061 -2
2     2021-09-13 06:42:36.152  1.18058  1.18060 -4
3     2021-09-13 06:42:38.154  1.18058  1.18061  4
4     2021-09-13 06:42:41.407  1.18058  1.18059 -4
...                       ...      ...      ... ..
36863 2021-09-13 15:54:15.477  1.17847  1.17849  4
36864 2021-09-13 15:54:15.799  1.17847  1.17848 -4
36865 2021-09-13 15:54:16.857  1.17848  1.17849  6
36866 2021-09-13 15:54:16.968  1.17847  1.17849 -2
36867 2021-09-13 15:54:17.051  1.17846  1.17848 -6

вопрос: как можно сделать так, чтобы показывались данные только за последние 2 часа, или 2.5 часа? пользовался методом показа последних 10К строк и понял что это не то, что нужно. Т.к. за час может и 500 и 1000 строк данных прийти.


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

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

Pandas умная библиотека, она понимает прямое сравнение даты-времени. Пример:

import datetime
import pandas as pd

now = datetime.datetime.now()
dt2 = now - datetime.timedelta(hours=2)
print(dt2)

df = pd.DataFrame({0: [now - datetime.timedelta(minutes=i*30) for i in range(10)]})
df.loc[df[0] > dt2]

Вывод:

2021-09-13 11:35:16.752729
                             0
0   2021-09-13 13:35:16.752729
1   2021-09-13 13:05:16.752729
2   2021-09-13 12:35:16.752729
3   2021-09-13 12:05:16.752729
→ Ссылка
Автор решения: strawdog

Если у вас есть датафрейм такого типа (то есть, колонка с временем не является индексом):

                     0
0  2021-09-12 00:00:00
1  2021-09-12 01:00:00
2  2021-09-12 02:00:00
3  2021-09-12 03:00:00
4  2021-09-12 04:00:00
5  2021-09-12 05:00:00
. . .
32 2021-09-13 08:00:00
33 2021-09-13 09:00:00
34 2021-09-13 10:00:00
35 2021-09-13 11:00:00
36 2021-09-13 12:00:00

то сделать можно просто, например, получив записи за последние 2.5 часа (2.5H), считая от последней записи в датафрейме:

res = df.reset_index().set_index(0).last("2.5H").reset_index().set_index("index")
res = res.rename_axis(None)

res:

                     0
34 2021-09-13 10:00:00
35 2021-09-13 11:00:00
36 2021-09-13 12:00:00
→ Ссылка