【发布时间】:2020-02-22 11:44:47
【问题描述】:
我有一个数据框,其中每一行都有一个开始时间和一个结束时间。每行也有一个他们所属的组。我想要一个新列,以秒为单位给出该组中所有时间的总和。
例如,如果我们有一个如下所示的组:
id1: |----|
id2: |-----|
id3: |--------|
. . . . . . . . . . .
time -> 12:00 12:04 12:07 12:10
那么对于属于该组的所有行,总时间为 4+3 min = 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)
【问题讨论】:
-
到目前为止你自己尝试过什么?
-
我尝试先按“组”对它们进行分组,然后找到该组的每个开始和结束的最小值和最大值,然后将该间隔设置为总和。这种方法不会涵盖不重叠的情况,因为它也包括“空”。
标签: python python-3.x pandas pandas-groupby