Python 基于时间间隔的熊猫随机基时群创建

Python 基于时间间隔的熊猫随机基时群创建,python,pandas,Python,Pandas,我有一个数据帧: 指数 时间 0 2021-01-11 08:38:27 1. 2021-01-11 08:40:32 2. 2021-01-11 09:13:37 3. 2021-01-11 11:26:52 4. 2021-01-11 12:57:26 5. 2021-01-11 13:19:33 6. 2021-01-11 15:19:33 7. 2021-01-12 10:25:33 8. 2021-01-12 10:27:21 9 2021-01-12 11:02:13 您可以在否定条

我有一个数据帧:

指数 时间 0 2021-01-11 08:38:27 1. 2021-01-11 08:40:32 2. 2021-01-11 09:13:37 3. 2021-01-11 11:26:52 4. 2021-01-11 12:57:26 5. 2021-01-11 13:19:33 6. 2021-01-11 15:19:33 7. 2021-01-12 10:25:33 8. 2021-01-12 10:27:21 9 2021-01-12 11:02:13
您可以在否定条件下使用
cumsum
,以识别块:

df['group'] = 'group_' + df['time'].diff().gt('1H').cumsum().add(1).astype(str)
输出:

                      time    group
index                              
0      2021-01-11 08:38:27  group_1
1      2021-01-11 08:40:32  group_1
2      2021-01-11 09:13:37  group_1
3      2021-01-11 11:26:52  group_2
4      2021-01-11 12:57:26  group_3
5      2021-01-11 13:19:33  group_3
6      2021-01-11 15:19:33  group_4
7      2021-01-12 10:25:33  group_5
8      2021-01-12 10:27:21  group_5
9      2021-01-12 11:02:13  group_5

您可以在否定条件下使用
cumsum
,以识别块:

df['group'] = 'group_' + df['time'].diff().gt('1H').cumsum().add(1).astype(str)
输出:

                      time    group
index                              
0      2021-01-11 08:38:27  group_1
1      2021-01-11 08:40:32  group_1
2      2021-01-11 09:13:37  group_1
3      2021-01-11 11:26:52  group_2
4      2021-01-11 12:57:26  group_3
5      2021-01-11 13:19:33  group_3
6      2021-01-11 15:19:33  group_4
7      2021-01-12 10:25:33  group_5
8      2021-01-12 10:27:21  group_5
9      2021-01-12 11:02:13  group_5

我认为这个问题需要进一步的分析,需要另一个解决方案,所以我想在此回顾一下

根据问题,任何两个时差超过1小时的条目都应分为不同的组。假设我们有以下两个
time

2021-01-11 08:38:27
2021-01-11 09:40:52
它们的差异超过1小时,应该分为不同的组,对吗?很明显,不是吗

好的,让我们再添加两个条目,它们之间有时间间隔,如下所示:

2021-01-11 08:38:27      <=== original entry #1   
2021-01-11 08:40:32           <=== new entry #1    diff less than 1 hour from previous entry
2021-01-11 09:13:37           <=== new entry #2    diff less than 1 hour from previous entry
2021-01-11 09:40:52      <=== original entry #2    diff less than 1 hour from previous entry
哦,为什么最后一个条目是
组1
而不是
组2

这是因为在第一个条目和最后一个条目之间添加的两个新条目在某种程度上“桥接”了第一个条目和最后一个条目,并使每两个连续条目的差异小于1小时。因此,结果是

那么,我们该怎么办?我认为我们应该根据绝对基准参考点对条目进行分组,该基准参考点不是上一个条目,而是一个条目,只要我们在距基准参考点一小时内处理条目,该条目就会保持不变。

我提出了以下代码:

base = df['time'].loc[0]
gc_list = []

for _, time in df['time'].items():
    if time - base > pd.Timedelta('1h'):
        base = time
    gc_list.append(time - base)

df['group_cumsum'] = pd.Series(gc_list)

df['group'] = 'group_' + df['group_cumsum'].eq('0h').cumsum().astype(str) 

print(df)

                  time    group_cumsum    group
0  2021-01-11 08:38:27 0 days 00:00:00  group_1
1  2021-01-11 08:40:32 0 days 00:02:05  group_1
2  2021-01-11 09:13:37 0 days 00:35:10  group_1
3  2021-01-11 09:40:52 0 days 00:00:00  group_2
现在,您可以看到最后一个条目现在正确地分组在一个单独的组下

在这里,我改编了@Quang Hoang的代码(非常优秀和优雅),并对其进行了微调,以使用新的分组机制。我一直试图以一种更为惯用的方式编写代码,而不使用循环。但是,由于逻辑必须依赖于局部变量
base
,因此我找不到更好的方法。如果有更好的方法,请随时提出建议

如果有人感兴趣,我在下面附上了完整的代码(以及其他测试用例):

完全代码
我认为这个问题需要进一步的分析,需要另一个解决方案,所以我想在此回顾一下

根据问题,任何两个时差超过1小时的条目都应分为不同的组。假设我们有以下两个
time

2021-01-11 08:38:27
2021-01-11 09:40:52
它们的差异超过1小时,应该分为不同的组,对吗?很明显,不是吗

好的,让我们再添加两个条目,它们之间有时间间隔,如下所示:

2021-01-11 08:38:27      <=== original entry #1   
2021-01-11 08:40:32           <=== new entry #1    diff less than 1 hour from previous entry
2021-01-11 09:13:37           <=== new entry #2    diff less than 1 hour from previous entry
2021-01-11 09:40:52      <=== original entry #2    diff less than 1 hour from previous entry
哦,为什么最后一个条目是
组1
而不是
组2

这是因为在第一个条目和最后一个条目之间添加的两个新条目在某种程度上“桥接”了第一个条目和最后一个条目,并使每两个连续条目的差异小于1小时。因此,结果是

那么,我们该怎么办?我认为我们应该根据绝对基准参考点对条目进行分组,该基准参考点不是上一个条目,而是一个条目,只要我们在距基准参考点一小时内处理条目,该条目就会保持不变。

我提出了以下代码:

base = df['time'].loc[0]
gc_list = []

for _, time in df['time'].items():
    if time - base > pd.Timedelta('1h'):
        base = time
    gc_list.append(time - base)

df['group_cumsum'] = pd.Series(gc_list)

df['group'] = 'group_' + df['group_cumsum'].eq('0h').cumsum().astype(str) 

print(df)

                  time    group_cumsum    group
0  2021-01-11 08:38:27 0 days 00:00:00  group_1
1  2021-01-11 08:40:32 0 days 00:02:05  group_1
2  2021-01-11 09:13:37 0 days 00:35:10  group_1
3  2021-01-11 09:40:52 0 days 00:00:00  group_2
现在,您可以看到最后一个条目现在正确地分组在一个单独的组下

在这里,我改编了@Quang Hoang的代码(非常优秀和优雅),并对其进行了微调,以使用新的分组机制。我一直试图以一种更为惯用的方式编写代码,而不使用循环。但是,由于逻辑必须依赖于局部变量
base
,因此我找不到更好的方法。如果有更好的方法,请随时提出建议

如果有人感兴趣,我在下面附上了完整的代码(以及其他测试用例):

完全代码
样本数据中有一种情况下,该逻辑可能会失败。例如,索引3的时间
'2021-01-11 09:40:52',
它应该在第2组中,因为它距离索引0的时间超过一个小时,但与索引2的时间相差仍然不到一个小时。我已经提出了修订的代码,以适应我评论的案例。请看一看,并随时微调它进一步。只是对解决方案的友好讨论:-)在示例数据之外,有一种情况表明此逻辑可能失败。例如,索引3的时间
'2021-01-11 09:40:52',
它应该在第2组中,因为它距离索引0的时间超过一个小时,但与索引2的时间相差仍然不到一个小时。我已经提出了修订的代码,以适应我评论的案例。请看一看,并随时微调它进一步。只是友好地讨论解决方案:-)如果需要根据时间序列中的所有条目计算1小时间隔,而不是根据序列中前一个条目的1小时差异计算1小时间隔,请看我下面的分析。如果您需要根据时间序列中的所有条目计算1小时间隔,而不是根据与序列中先前条目的1小时差异计算1小时间隔,请看我下面的分析。