Панды: группа по неизвестному периоду времени - PullRequest
0 голосов
/ 19 декабря 2018

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

Пример: Здесь у нас есть два периода времени:

  • от05:36:07 до 05:36:42
  • от 21:54:16 до 21:54:37

Данные:

id,timestamp,value
00b0f3,2018-05-21 05:36:07,4
00b0f3,2018-05-21 05:36:14,6
00b0f3,2018-05-21 05:36:24,2
00b0f3,2018-05-21 05:36:40,1
00b0f3,2018-05-21 05:36:42,6
00b0f3,2018-05-21 21:54:16,3
00b0f3,2018-05-21 21:54:27,2
00b0f3,2018-05-21 21:54:30,6
00b0f3,2018-05-21 21:54:34,4
00b0f3,2018-05-21 21:54:37,9

Это должно как-то заканчиваться следующим образом:

id,timeserie,value
00b0f3,1,19
00b0f3,2,24

Есть ли какие-нибудь помощники от панд, которые позволяют мне определять периоды времени по максимальному значению между временем?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы можете использовать groupby и pd.Grouper следующим образом:

df = df.groupby(["id",pd.Grouper(key="timestamp", freq='2min')]).sum()

Результат будет:

>>> df
                            value
id     timestamp                 
00b0f3 2018-05-21 05:36:00     19
       2018-05-21 21:54:00     24

Если вы хотите иметь id в качестве отдельногостолбец, который вы можете запустить ниже строки кода:

df.reset_index(inplace=True)

И тогда будет получен DataFrame:

>>> df
       id           timestamp  value
0  00b0f3 2018-05-21 05:36:00     19
1  00b0f3 2018-05-21 21:54:00     24

Примечание

Я вставил ваши данные в csv файл, а затем импортировал его и создал DataFrame следующим образом:

import pandas as pd

df = pd.read_csv("D:/tmp/data.csv")
df["timestamp"] = pd.to_datetime(df["timestamp"])
0 голосов
/ 19 декабря 2018

Попробуйте использовать cumsum и логическое условие теста с groupby:

df.groupby(['id',
           (df['timestamp'].diff() > pd.Timedelta(minutes=2)).cumsum()], 
           as_index=False)['value'].sum()

Выход:

       id  value
0  00b0f3     19
1  00b0f3     24
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...