Анализ временных рядов Pandas - обобщение изменений состояния в кадре данных / удаление избыточных дат - PullRequest
1 голос
/ 10 июля 2019

У меня есть кадр данных, подобный следующему (приведенные ниже данные упрощены, чтобы предоставить минимальный пример):

df = 
item state            startTime             endTime
   A     1  2019-05-01 04:30:00 2019-05-02 04:30:00
   A     1  2019-05-02 04:30:00 2019-05-04 04:30:00
   A     1  2019-05-04 04:30:00 2019-05-10 04:30:00
   A     2  2019-05-10 04:30:00 2019-05-12 04:30:00
   A     2  2019-05-12 04:30:00 2019-05-13 04:30:00
   A     1  2019-05-13 04:30:00 2019-05-25 04:30:00

Где элемент A находится в состоянии 1 с 2019-05-01 04:30:00 до2019-05-10 04:30:00, затем в состоянии 2 с 2019-05-10 с 04:30:00 до 2019-05-13 04:30:00, затем обратно в состояние 1 с 2019-05-13 04: С 30:00 до 2019-05-25 04: 30: 00.

Я пытаюсь упростить фрейм данных, чтобы иметь только 3 строки, которые предоставляют одну и ту же информацию, используя startTime из первого вхождения состоянияи затем endTime для последнего появления этого состояния перед переключением в новое состояние.

Вот результат, к которому я стремлюсь:

df = 
item state            startTime             endTime
   A     1  2019-05-01 04:30:00 2019-05-10 04:30:00
   A     2  2019-05-10 04:30:00 2019-05-13 04:30:00
   A     1  2019-05-13 04:30:00 2019-05-25 04:30:00

Фактический фрейм данных, которым я манипулирую, может иметь длину в несколько тысяч строк, и поэтому я надеюсь, что смогу выполнить эту операциюбыстро.Надеялся, что кто-нибудь может направить меня в правильном направлении или предложить операции с пандами, которые я ищу?Я не новичок в пандах, но понятия не имею, как к этому подойти и хотел бы не изобретать колесо здесь ...

Заранее благодарен за любую помощь.

1 Ответ

0 голосов
/ 10 июля 2019

Вы можете использовать diff и cumsum, создать ключ groupby, затем agg

d={'item':'first','state':'first','startTime':'min','endTime':'max'}
df.groupby([df.item,df.state.diff().ne(0).cumsum()]).agg(d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...