根据条件查找最高日期时间,并通过在Python中分组来计算最高时间和最低时间之间的平均差

问题描述

我有一个看起来像这样的数据框:

| date_time           | decision | id | steps   |
|---------------------|----------|----|---------|
| 2017-04-15 12:57:56 | yes      | 1  | step1   |
| 2017-04-15 12:58:35 | yes      | 1  | step2   |
| 2017-04-15 13:00:34 | yes      | 1  | confirm |
| 2017-04-15 12:58:03 | yes      | 1  | step1   |
| 2017-04-15 13:00:14 | yes      | 1  | step3   |
| 2017-04-13 09:02:00 | yes      | 1  | step1   |
| 2017-04-13 09:05:02 | yes      | 1  | step2   |
| 2017-04-13 09:08:45 | yes      | 1  | step3   |
| 2017-04-13 09:09:13 | yes      | 1  | confirm |
| 2017-04-18 02:36:30 | no       | 5  | step1   |
| 2017-04-18 02:37:02 | no       | 5  | step1   |
| 2017-04-19 02:38:24 | no       | 5  | step1   |
| 2017-04-19 02:38:52 | no       | 5  | step2   |
| 2017-04-19 02:44:54 | no       | 5  | confirm |
| 2017-04-19 02:40:12 | no       | 5  | step3   |
| 2017-04-01 17:16:24 | yes      | 6  | step1   |
| 2017-04-01 17:17:25 | yes      | 6  | step3   |
| 2017-04-01 17:17:59 | yes      | 6  | confirm |
| 2017-04-01 17:17:36 | yes      | 6  | step2   |
| 2017-04-01 17:16:28 | yes      | 6  | step1   |
| 2017-04-01 17:16:34 | yes      | 6  | step2   |
| 2017-04-01 17:17:42 | yes      | 6  | step3   |
| 2017-04-04 13:06:21 | yes      | 6  | step2   |
| 2017-04-04 13:02:54 | yes      | 6  | step1   |

以下是数据框:

df=pd.DataFrame({'id' : [1]*9 + [5]*6 + [6]*9,'steps' : ['step1','step2','confirm','step1','step3','step1'],'decision' : ['yes']*9 + ['no']*6 + ['yes']*9,'date_time' : ['2017-04-15 12:57:56','2017-04-15 12:58:35','2017-04-15 13:00:34','2017-04-15 12:58:03','2017-04-15 13:00:14','2017-04-13 09:02:00','2017-04-13 09:05:02','2017-04-13 09:08:45','2017-04-13 09:09:13','2017-04-18 02:36:30','2017-04-18 02:37:02','2017-04-19 02:38:24','2017-04-19 02:38:52','2017-04-19 02:44:54','2017-04-19 02:40:12','2017-04-01 17:16:24','2017-04-01 17:17:25','2017-04-01 17:17:59','2017-04-01 17:17:36','2017-04-01 17:16:28','2017-04-01 17:16:34','2017-04-01 17:17:42','2017-04-04 13:06:21','2017-04-04 13:02:54']})

我需要执行以下任务:

  1. “ date_time”列为“ object”数据类型。因此,我利用以下代码将其转换为日期时间数据类型:
df['date_time'] =  pd.to_datetime(df['date_time'],format='%Y%m%d %H:%M:%s')

现在,我需要从“ date_time”列中创建两个单独的列“ date”和“ time”,以使“ date”列为 date数据类型,而“ time”列为时间数据类型 2.问题的第二部分-对于每个ID和相同的日期,我需要计算给定日期的最高时间和最低时间之间的差。仅当steps ='confirm'时才考虑最长的时间,这意味着,如果任何id在其steps列中没有“ confirm”,我们将不计算该日期的差额。接下来,当我们为每个ID和日期计算出差异时,我需要计算这些差异的平均值,然后按决策列将其分组。例如,如果我们考虑id = 1,则会发现有2个日期,即2017-04-15和2017-04-13。由于两个日期均显示step ='confirm',因此我们将从每个日期中具有step ='confirm'的时间中减去最短的时间。剩余的ID将遵循类似的步骤。在此之后,我想查找决策类别“是”和“否”的那些时间差的平均值。 (基本上,我们将对决策='是'和决策='否'分别执行整个操作。在决策='是'中,我们有4个不同的日期:2017-04-15,2017-04-13,2017- 04-01和2017-04-04。在id = 1内,考虑具有step ='confirm'的date_time值,因此对于日期2017-04-15-从13:00:34减去12:57:56,日期2017-04-13-从09:09:13减去09:02:00。同样,在id = 6内,我们将考虑日期2017-04-01而不是2017-04-04,因为它没有step ='confirm'。因此,对于日期2017-04-01-从17:17:59减去17:16:24,然后计算这些时间差的平均值,这些时间差将落入决策列的“是”类别。将对具有两个日期id = 5的Decision =“ no”执行相同的操作。我们仅考虑日期2017-04-19,因为它具有step ='confirm'并从02:44减去02:38:24 :54。由于Decision =“ no”不再有值,因此在这种情况下,计算出的差异将为平均值。

问题第二部分的最终输出应如下所示(平均值约为):

| decision | avg     |
|----------|---------|
| yes      | 0:03:48 |
| no       | 0:06:30 |

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)