Как эффективно выбрать из DataFrame строки во временных интервалах?
Есть DataFrame:
DATE DECDATE HAE HAN HK2
0 2020:01:01:00:00 1577793600 135.080287 719.287209 8.352746
1 2020:01:01:00:01 1577793660 135.076589 719.294816 8.351585
2 2020:01:01:00:02 1577793720 135.087681 719.291013 8.351263
3 2020:01:01:00:03 1577793780 135.079054 719.303691 8.350585
4 2020:01:01:00:04 1577793840 135.092611 719.312567 8.352230
5 2020:01:01:00:05 1577793900 135.075357 719.293548 8.353165
6 2020:01:01:00:06 1577793960 135.076589 719.291013 8.353584
7 2020:01:01:00:07 1577794020 135.090146 719.297352 8.353165
8 2020:01:01:00:08 1577794080 135.086449 719.307495 8.352585
9 2020:01:01:00:09 1577794140 135.069195 719.293548 8.353455
........
Столбец DECDATE содержит время в секундах от начала эпохи (1 января 1970г). Необходимо выбрать строки в последовательных интервалах времени. Допустим, каждый временной интервал составляет 3 минуты.
Пробовал так:
frst=df.loc[0,'DECDATE'] #Первое значение в столбце
for every in df['DECDATE']:
intrvl=frst+180 #К первому значению прибавляем 3 минуты в секундах
sample=df[df[df['DECDATE']>=frst]<intrvl]
#sample=df.query("frst <= DECDATE < intrvl")
frst=intrvl
Похоже, из за цикла обработка файла длиной год происходит очень долго. Пока ничего лучше не придумал.
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
Попробуйте так:
res = df.set_index(pd.to_datetime(df['DECDATE'], unit='s')).resample('3T').mean()
результат:
In [7]: res
Out[7]:
DECDATE HAE HAN HK2
DECDATE
2019-12-31 12:00:00 1577793660 135.081519 719.291013 8.351865
2019-12-31 12:03:00 1577793840 135.082341 719.303269 8.351993
2019-12-31 12:06:00 1577794020 135.084395 719.298620 8.353111
2019-12-31 12:09:00 1577794140 135.069195 719.293548 8.353455
или так:
In [8]: res.reset_index(drop=True)
Out[8]:
DECDATE HAE HAN HK2
0 1577793660 135.081519 719.291013 8.351865
1 1577793840 135.082341 719.303269 8.351993
2 1577794020 135.084395 719.298620 8.353111
3 1577794140 135.069195 719.293548 8.353455
более быстрый вариант (без парсинга даты и времени):
In [15]: cols = ['HAE', 'HAN', 'HK2']
In [16]: res = df.groupby(df['DECDATE'] // 180 * 180)[cols].mean().reset_index()
In [17]: res
Out[17]:
DECDATE HAE HAN HK2
0 1577793600 135.081519 719.291013 8.351865
1 1577793780 135.082341 719.303269 8.351993
2 1577793960 135.084395 719.298620 8.353111
3 1577794140 135.069195 719.293548 8.353455
Автор решения: strawdog
→ Ссылка
Для
DATE DECDATE HAE HAN HK2
0 2020:01:01:00:00 1577793600 135.080287 719.287209 8.352746
1 2020:01:01:00:01 1577793660 135.076589 719.294816 8.351585
2 2020:01:01:00:02 1577793720 135.087681 719.291013 8.351263
3 2020:01:01:00:03 1577793780 135.079054 719.303691 8.350585
4 2020:01:01:00:04 1577793840 135.092611 719.312567 8.352230
5 2020:01:01:00:05 1577793900 135.075357 719.293548 8.353165
6 2020:01:01:00:06 1577793960 135.076589 719.291013 8.353584
7 2020:01:01:00:07 1577794020 135.090146 719.297352 8.353165
8 2020:01:01:00:08 1577794080 135.086449 719.307495 8.352585
9 2020:01:01:00:09 1577794140 135.069195 719.293548 8.353455
df['DECDATE'] = pd.to_datetime(df['DECDATE'], unit='s')
res =df.groupby(pd.Grouper(key='DECDATE', freq='3Min')).mean()
соответственно, res будет:
HAE HAN HK2
DECDATE
2019-12-31 12:00:00 135.081519 719.291013 8.351865
2019-12-31 12:03:00 135.082341 719.303269 8.351993
2019-12-31 12:06:00 135.084395 719.298620 8.353111
2019-12-31 12:09:00 135.069195 719.293548 8.353455