2016-09-27 31 views
2

我想根据可变的时间间隔将行分组。 但是,在做分组时,我想忽略日期部分,只根据时间日期分组。我想每5分钟一组。基于日期时间类型的熊猫组数据帧忽略日期部分

 timestampe   val 
0 2016-08-11 11:03:00  0.1 
1 2016-08-13 11:06:00  0.3 
2 2016-08-09 11:04:00  0.5 
3 2016-08-05 11:35:00  0.7 
4 2016-08-19 11:09:00  0.8 
5 2016-08-21 12:37:00  0.9 

     into 

     timestampe    val 
0 2016-08-11 11:03:00  0.1 
2 2016-08-09 11:04:00  0.5 

     timestampe    val 
1 2016-08-13 11:06:00  0.3 
4 2016-08-19 11:09:00  0.8 

     timestampe    val 
3 2016-08-05 11:35:00  0.7 
     timestampe    val 
5 2016-08-21 12:37:00  0.9 

注意,只要时间在相同的5分钟间隔内,不管日期如何,行都会分组。

+0

我试过TimeGrouper,它考虑了日期。还尝试创建一个只有时间分区的附加列,但它不知何故不允许我再使用TimeGrouper。 – 9blue

+0

有没有答案的问题。你希望5分钟的时间间隔从第一次观察开始?意思是,第一个观察是11点03分,所有的行都是11点08分。如果是这样,想象一下你拿到11点03分,然后是11点45分,然后是11点07分。你想分组11:03和11:07,然后下一个组以11:45开始?或者,你想首先按时间排序吗?如果这是真的,那么第一行的时间是任意的。或者,你是否满意将一天分成5分钟的窗户? – piRSquared

+0

@piRSquared将当天分成5分钟的窗口。 – 9blue

回答

3

这是假设你分割当日上涨到5分钟窗口

df.groupby(df.timestampe.dt.hour.mul(60) \ 
      .add(df.timestampe.dt.minute) // 5) \ 
    .apply(pd.DataFrame.reset_index) 

enter image description here


for name, group in df.groupby(df.timestampe.dt.hour.mul(60).add(df.timestampe.dt.minute) // 5): 
    print name 
    print group 
    print 

132 
      timestampe val 
0 2016-08-11 11:03:00 0.1 
2 2016-08-09 11:04:00 0.5 

133 
      timestampe val 
1 2016-08-13 11:06:00 0.3 
4 2016-08-19 11:09:00 0.8 

139 
      timestampe val 
3 2016-08-05 11:35:00 0.7 

151 
      timestampe val 
5 2016-08-21 12:37:00 0.9 
+0

对不起,我没有说清楚。所以5分钟的窗口不仅适用于1小时的范围。 11:35但是12:37应该在不同的窗口中。 您的解决方案只需要一小部分时间。 – 9blue

+0

@ 9blue固定的帖子。 – piRSquared

0

既然你不关心你的datetime对象的date的一部分,我想这使得所有date平等是一个很好的窍门。

df['time'] = df['timestamp'].apply(lambda x: x.replace(year=2000, month=1, day=1)) 

你得到:

  timestamp val    time 
0 2016-08-11 11:03:00 0.1 2000-01-01 11:03:00 
1 2016-08-13 11:06:00 0.3 2000-01-01 11:06:00 
2 2016-08-09 11:04:00 0.5 2000-01-01 11:04:00 
3 2016-08-05 11:35:00 0.7 2000-01-01 11:35:00 
4 2016-08-19 11:09:00 0.8 2000-01-01 11:09:00 
5 2016-08-21 11:37:00 0.9 2000-01-01 11:37:00 

现在,你可以做你的time列什么。例如,每5分钟一组:

grouped = df.groupby(Grouper(key='time', freq='5min')) 

grouped.count() 

        timestamp val 
time        
2000-01-01 11:00:00   2 2 
2000-01-01 11:05:00   2 2 
2000-01-01 11:10:00   0 0 
2000-01-01 11:15:00   0 0 
2000-01-01 11:20:00   0 0 
2000-01-01 11:25:00   0 0 
2000-01-01 11:30:00   0 0 
2000-01-01 11:35:00   2 2 

希望这个技巧可能适合您的需要。谢谢!