У меня есть датафрейм, где у каждой строки есть время начала и время окончания. У каждого ряда также есть группа, к которой они принадлежат. Я хочу получить новый столбец, в котором будет указана сумма времени в этой группе в секундах.
Например, если у нас есть группа, которая выглядит следующим образом:
id1: |----|
id2: |-----|
id3: |--------|
. . . . . . . . . . .
time -> 12:00 12:04 12:07 12:10
, тогда для всех строк, принадлежащих этой группе, будет получено суммарное время 4 + 3 мин = 420 секунд
Если они полностью перекрываются, то мы получим такой сценарий:
id1: |--------|
id2: |--------|
. . . . . . . . . . .
time -> 12:00 12:04 12:07 12:10
, который даст нам результат 4 мин = 240 секунд.
Ниже приведены некоторые фиктивные данные:
import pandas as pd
ids = [x for x in range(10)]
group = [0, 1, 1, 2, 2, 3, 4, 4, 4, 4]
start = pd.to_datetime(["2019-10-21-16:20:00", "2019-10-21-16:22:00", "2019-10-21-16:22:00", "2019-10-21-16:15:00",
"2019-10-21-16:22:00", "2019-10-21-16:58:00", "2019-10-21-17:02:00", "2019-10-21-17:03:00",
"2019-10-21-17:04:00", "2019-10-21-17:20:00"])
end = pd.to_datetime(["2019-10-21-16:25:00", "2019-10-21-16:24:00", "2019-10-21-16:24:00", "2019-10-21-16:18:00",
"2019-10-21-16:26:00", "2019-10-21-17:02:00", "2019-10-21-17:06:00", "2019-10-21-17:07:00",
"2019-10-21-17:08:00", "2019-10-21-17:22:00"])
cols = ["id", "group", "start", "end"]
df = pd.DataFrame(dict(zip(cols, [ids, group, start, end])))
Пока что подход, который я пробовал, явно не верен. Я попытался сгруппировать, а затем найти минимальное и максимальное значения каждого начала и конца этой группы, а затем просто установить этот интервал в качестве суммы. Этот подход не будет правильным, поскольку он также будет включать в себя разрыв в интервале.
gr = df.groupby("group").apply(lambda x : x.end.max() - x.start.min())
df['total_time'] = df.group.map(gr)