рассчитать разницу во времени в группе из нескольких столбцов в pandas - PullRequest
0 голосов
/ 10 января 2020

У меня есть такой фрейм данных:

  user       datetime              mode
    -------------------------------------------------
    1        2015-09-10 11:50:27        vehicle
    1        2015-11-22 10:15:03        vehicle
    1        2015-11-23 10:35:03        stop
    2        2015-11-22 10:11:13         walk
    2        2015-11-22 10:13:08         walk
    2        2015-09-10 10:21:52         stop

Я пытаюсь рассчитать время поездки (режим) для каждого пользователя, для каждого дня месяца.

Мой Идея состояла в том, чтобы извлечь месяц, день, час, а затем сгруппировать по пользователю, месяцу, дню, режиму и часу, чтобы вычислить разницу между максимальными и минимальными значениями, используя это.

df.assign(output=main_table.groupby(['user','month_n','day_n','mode','hour_n']).datetime
                  .apply(lambda x: x - x.iloc[0]))

однако, когда я пытаюсь подвести итог выводит

df.groupby(['user','month_n','day_n','mode','hour_n'])['output'].sum()

это не дает правильного результата.

Мой желаемый вывод

  user     month        day        mode        time_spent(sec)
    -------------------------------------------------
    1      10         5         vehicle        3600
    1      10         5         walk           12345
    1      10         5         stop           25879
    1      10         6         walk           15
    1      10         6         vehicle        98522
    2      10         5         walk           1298522
    2      10         11        vehicle        99622
    3      10         6         vehicle        23247

Любая помощь будет высоко ценится !! Спасибо.

ОБНОВЛЕНО лучший пример df

user    datetime            mode 
 -------------------------------------------------
1   10/09/2015  11:50:27    vehicle
1   10/09/2015  11:50:37    vehicle
1   10/09/2015  11:52:57    vehicle
1   10/09/2015  11:53:27    vehicle
1   10/09/2015  10:21:52    walk
1   10/09/2015  11:52:02    walk
1   10/09/2015  11:53:32    walk
1   10/09/2015  10:23:32    walk
1   10/09/2015  11:50:22    vehicle
1   10/09/2015  11:50:57    vehicle
2   22/11/2015 10:15:53     walk
2   22/11/2015 10:13:53     walk
2   22/11/2015 10:16:08     walk
2   22/11/2015 10:15:38     walk
2   22/11/2015 10:16:23     walk
2   22/11/2015 10:10:33     walk
2   22/11/2015 10:15:03     walk
2   22/11/2015 10:11:13     walk
2   22/11/2015 10:13:08     walk
2   22/11/2015 10:10:28     walk

для добавления некоторого набора данных контекста, содержащего много пользователей, несколько недель даты и времени и 10 различных режимов, которые можно повторить Много раз в течение дня, у каждого из них есть отметка времени начала / окончания.

1 Ответ

1 голос
/ 10 января 2020

Вот как я буду go:

from io import StringIO
import pandas as pd

s = """user,datetime,mode
1,  10/09/2015  11:50:27,    vehicle
1,  10/09/2015  11:50:37,    vehicle
1,  10/09/2015  11:52:57,    vehicle
1,  10/09/2015  11:53:27,    vehicle
1,  10/09/2015  10:21:52,    walk
1,  10/09/2015  11:52:02,    walk
1,  10/09/2015  11:53:32,    walk
1,  10/09/2015  10:23:32,    walk
1,  10/09/2015  11:50:22,    vehicle
1,  10/09/2015  11:50:57,    vehicle
2,  22/11/2015 10:15:53 ,    walk
2,  22/11/2015 10:13:53 ,    walk
2,  22/11/2015 10:16:08 ,    walk
2,  22/11/2015 10:15:38 ,    walk
2,  22/11/2015 10:16:23 ,    walk
2,  22/11/2015 10:10:33 ,    walk
2,  22/11/2015 10:15:03 ,    walk
2,  22/11/2015 10:11:13 ,    walk
2,  22/11/2015 10:13:08 ,    walk
2,  22/11/2015 10:10:28 ,    walk"""

df = pd.read_csv(StringIO(s))

df.datetime = pd.to_datetime(df.datetime)

df.groupby(["user", "mode"]).datetime.max() - df.groupby(
    ["user", "mode"]
).datetime.min()

Он генерирует желаемый результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...