python – 由时间窗口组成的熊猫组

前端之家收集整理的这篇文章主要介绍了python – 由时间窗口组成的熊猫组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
编辑: Session generation from log file analysis with pandas似乎正是我想要的.

我有一个包含非唯一时间戳的数据帧,我想按时间窗口对它们进行分组.基本逻辑是 –

1)通过在时间戳之前和之后添加n分钟,从每个时间戳创建时间范围.

2)按重叠的时间范围分组.这里的最终效果是时间窗口可以像单个时间戳一样小 – 时间缓冲区,但是时间窗口的大小没有上限,只要多个事件的距离小于时间缓冲

感觉就像df.groupby(pd.TimeGrouper(minutes = n))是正确的答案,但我不知道如何让TimeGrouper在看到时间缓冲区内的事件时创建动态时间范围.

例如,如果我在一组事件中尝试使用TimeGrouper(’20s’):10:3​​4:00,10:34:08,10:34:15,10:34:28和10 :34:54,那么大熊猫会给我三组(事件发生在10:34:00 – 10:34:20,10:34:20-10:34:40和10:34:40-10:35之间:00).我想回到两个小组,10:34:00-10:34:28,因为在那个时间范围内事件之间的差距不超过20秒,第二组是10:34:54 .

查找时间范围不是静态时间范围的时间窗口的最佳方法是什么?

鉴于系列看起来像 –

  1. time
  2. 0 2013-01-01 10:34:00+00:00
  3. 1 2013-01-01 10:34:12+00:00
  4. 2 2013-01-01 10:34:28+00:00
  5. 3 2013-01-01 10:34:54+00:00
  6. 4 2013-01-01 10:34:55+00:00
  7. 5 2013-01-01 10:35:19+00:00
  8. 6 2013-01-01 10:35:30+00:00

如果我在该系列赛上进行df.groupby(pd.TimeGrouper(’20s’)),我会回到5组,10:34:00-:20,:20-:40,:40-10:35: 00,等等.我想要做的是创建弹性时间范围的功能..只要事件在20秒内,扩展时间范围.所以我希望能回来 –

  1. 2013-01-01 10:34:00 - 2013-01-01 10:34:48
  2. 0 2013-01-01 10:34:00+00:00
  3. 1 2013-01-01 10:34:12+00:00
  4. 2 2013-01-01 10:34:28+00:00
  5.  
  6. 2013-01-01 10:34:54 - 2013-01-01 10:35:15
  7. 3 2013-01-01 10:34:54+00:00
  8. 4 2013-01-01 10:34:55+00:00
  9.  
  10. 2013-01-01 10:35:19 - 2013-01-01 10:35:50
  11. 5 2013-01-01 10:35:19+00:00
  12. 6 2013-01-01 10:35:30+00:00

谢谢.

解决方法

这是如何使用来创建自定义分组器. (需要pandas> = 0.13)进行timedelta计算,否则可以在其他版本中使用.

创建你的系列

  1. In [31]: s = Series(range(6),pd.to_datetime(['20130101 10:34','20130101 10:34:08','20130101 10:34:15','20130101 10:34:28','20130101 10:34:54','20130101 10:34:55','20130101 10:35:12']))
  2.  
  3. In [32]: s
  4. Out[32]:
  5. 2013-01-01 10:34:00 0
  6. 2013-01-01 10:34:08 1
  7. 2013-01-01 10:34:08 2
  8. 2013-01-01 10:34:15 3
  9. 2013-01-01 10:34:28 4
  10. 2013-01-01 10:34:54 5
  11. 2013-01-01 10:34:55 6
  12. 2013-01-01 10:35:12 7
  13. dtype: int64

这只是计算连续元素之间的时间差,以秒为单位,但实际上可以是任何东西

  1. In [33]: indexer = s.index.to_series().order().diff().fillna(0).astype('timedelta64[s]')
  2.  
  3. In [34]: indexer
  4. Out[34]:
  5. 2013-01-01 10:34:00 0
  6. 2013-01-01 10:34:08 8
  7. 2013-01-01 10:34:08 0
  8. 2013-01-01 10:34:15 7
  9. 2013-01-01 10:34:28 13
  10. 2013-01-01 10:34:54 26
  11. 2013-01-01 10:34:55 1
  12. 2013-01-01 10:35:12 17
  13. dtype: float64

Arbitrariy分配东西< 20s到0组,否则到1组.这也可能更随意.如果之前的差异是< 0但是总差异(从第一个)是> 50组在第2组.

  1. In [35]: grouper = indexer.copy()
  2.  
  3. In [36]: grouper[indexer<20] = 0
  4.  
  5. In [37]: grouper[indexer>20] = 1
  6.  
  7. In [95]: grouper[(indexer<20) & (indexer.cumsum()>50)] = 2
  8.  
  9. In [96]: grouper
  10. Out[96]:
  11. 2013-01-01 10:34:00 0
  12. 2013-01-01 10:34:08 0
  13. 2013-01-01 10:34:08 0
  14. 2013-01-01 10:34:15 0
  15. 2013-01-01 10:34:28 0
  16. 2013-01-01 10:34:54 1
  17. 2013-01-01 10:34:55 2
  18. 2013-01-01 10:35:12 2
  19. dtype: float64

Groupem(也可以在这里申请)

  1. In [97]: s.groupby(grouper).sum()
  2. Out[97]:
  3. 0 10
  4. 1 5
  5. 2 13
  6. dtype: int64

猜你在找的Python相关文章