I have a sorted data frame pandas(time-based), for example:
from datetime import datetime
df = pd.DataFrame({ 'ActivityDateTime' : [datetime(2016,5,13,6,14),datetime(2016,5,13,6,16),
datetime(2016,5,13,6,20),datetime(2016,5,13,6,27),datetime(2016,5,13,6,31),
datetime(2016,5,13,6,32),
datetime(2016,5,13,17,34),datetime(2016,5,13,17,36),
datetime(2016,5,13,17,38),datetime(2016,5,13,17,45),datetime(2016,5,13,17,47),
datetime(2016,5,16,13,3),datetime(2016,5,16,13,6),
datetime(2016,5,16,13,10),datetime(2016,5,16,13,14),datetime(2016,5,16,13,16)],
'Value1' : [0.0,2.0,3.0,4.0,0.0,0.0,0.0,7.0,8.0,4.0,0.0,0.0,3.0,9.0,1.0,0.0],
'Value2' : [0.0,2.0,3.0,4.0,0.0,0.0,0.0,7.0,8.0,4.0,0.0,0.0,3.0,9.0,1.0,0.0]
})
What happens like this:
ActivityDateTime Value1 Value2
0 2016-05-13 06:14:00 0.0 0.0
1 2016-05-13 06:16:00 2.0 2.0
2 2016-05-13 06:20:00 3.0 3.0
3 2016-05-13 06:27:00 4.0 4.0
4 2016-05-13 06:31:00 0.0 0.0
5 2016-05-13 06:32:00 0.0 0.0
6 2016-05-13 17:34:00 0.0 0.0
7 2016-05-13 17:36:00 7.0 7.0
8 2016-05-13 17:38:00 8.0 8.0
9 2016-05-13 17:45:00 4.0 4.0
10 2016-05-13 17:47:00 0.0 0.0
11 2016-05-16 13:03:00 0.0 0.0
12 2016-05-16 13:06:00 3.0 3.0
13 2016-05-16 13:10:00 9.0 9.0
14 2016-05-16 13:14:00 1.0 1.0
15 2016-05-16 13:16:00 0.0 0.0
I would like to aggregate data (averaging) without a for loop. However, the way I am going to group observations is not straightforward! Looking at Value1, I want to group them as non-zero. For example, indicators 1,2,3will be in one group. Incidies 7,8,9in one group and another - 12,13,14. Lines where value1==0should be avoided, and zeros just act as separation between groups. In the end, I would like to get something like this:
Activity_end Activity_start Value1 Value2 num_observations
0 2016-05-13 06:27:00 2016-05-13 06:16:00 4.50 4.50 3
1 2016-05-13 17:45:00 2016-05-13 17:36:00 6.33 6.33 3
2 2016-05-16 13:14:00 2016-05-16 13:06:00 4.33 4.33 3
, - 1, 2 3 , . , for! , Value1 Value2 .