识别R数据帧中的连续时间间隔

时间:2017-09-15 22:09:47

标签: r datetime time-series geospatial

可能我需要更改标题,但我缺乏语言来简明扼要地表达问题。

我有一个具有以下结构的大数据框:

class(df)
[1] "SpatialPointsDataFrame"

df

           coordinates   ID      group_id value1    time    zone
1  (9.09077, 45.47737) 24739        1      70 1505480403      62
2  (9.24016, 45.50221) 62965        1      35 1505480403      19
3  (9.22375, 45.50891) 93104        1      86 1505480403      16
4  (9.24392, 45.51171) 35646        1      80 1505480403      17
5  (9.24326, 45.51349) 24747        1      80 1505480403      17
6  (9.12738, 45.46933) 44274        1      53 1505480403      60
7  (9.25434, 45.45346) 53579        1      99 1505480403      30
8  (9.20306, 45.42118) 74565        1      37 1505480403      38
9   (9.1183, 45.45458) 74521        1      79 1505480403      53
10 (9.14386, 45.44674) 53584        1      62 1505480403      49
11 (9.14961, 45.51675) 44283        1      80 1505480403      81
12 (9.20478, 45.50888) 62936        1      50 1505480403      13
13   (9.20352, 45.421) 87311        1      80 1505480403      38
14 (9.11081, 45.49871) 43467        1      80 1505480403      65
15 (9.25292, 45.51276) 93101        1      41 1505480403      17
16 (9.08882, 45.45794) 53507        1      26 1505480403      55
17  (9.2071, 45.50587) 53522        1      80 1505480403      13
18 (9.22379, 45.50888) 87372        1      80 1505480403      16
19 (9.24388, 45.50456) 87332        1      21 1505480403      19
20 (9.20917, 45.51816) 47710        1      69 1505480403      15
21 (9.12292, 45.50486) 06213        1      83 1505480403      72
22 (9.21751, 45.51149) 35633        1      80 1505480403      16
23 (8.85098, 45.60636) 35632        1      70 1505480403     N/A
24 (9.08967, 45.46126) 79065        1      29 1505480403      55
25  (9.11043, 45.4958) 72813        1      80 1505480403      65
26 (9.14425, 45.44787) 06221        1      53 1505480403      49
27 (9.21566, 45.51105) 06286        1      81 1505480403      16
28 (9.15909, 45.52463) 53547        1      22 1505480403      82
29  (9.1357, 45.45472) 74513        1      85 1505480403      52
30 (8.85068, 45.60646) 62949        1      80 1505480403     N/A
31 (9.20874, 45.42597) 06296        1      20 1505480403      38
32  (9.1992, 45.51189) 62972        1      84 1505480403      14
33 (9.15462, 45.51798) 43496        1      52 1505480403      81
34 (9.08816, 45.47548) 87351        1      21 1505480403      62
35 (9.13154, 45.43608) 93106        1      50 1505480403      48
36 (9.14139, 45.44461) 14879        1      29 1505480403      48
37 (9.19553, 45.44263) 43464        1      78 1505480403      37
38 (9.14361, 45.48266) 87371        1      80 1505480403      58
39 (9.13611, 45.46989) 36099        1      91 1505480403      57
40 (9.22385, 45.50939) 53590        1      94 1505480403      16
41 (9.08562, 45.45992) 75494        1      40 1505480403      55
42 (9.20702, 45.52272) 24709        1      44 1505480403      14
43 (9.23615, 45.50845) 53577        1      31 1505480403      16
44 (9.08801, 45.47528) 24766        1      64 1505480403      62
45 (9.24426, 45.51104) 62975        1      80 1505480403      17
46  (9.2403, 45.50226) 62965        1      35 1505476803      19
47 (9.22376, 45.50896) 93104        1      86 1505476803      16
48 (9.09076, 45.47738) 24739        1      70 1505476803      62
49 (9.24405, 45.51173) 35646        1      80 1505476803      17
50 (9.24327, 45.51344) 24747        1      80 1505476803      17
106 (9.22914, 45.45137) 30907       1      89 1505376003      29
112 (9.22917, 45.45136) 30907       1      89 1505372403      29
118 (9.2291, 45.45126) 30907        1      89 1505368803      29
124 (9.22917, 45.45137) 30907       1      89 1505365203      29
130 (9.22918, 45.4514) 30907        1      89 1505361603      29

正如您在最后几行中所看到的那样,经常发生观察发生在同一点(或其附近),在连续探测器中使用相同的传感器。 有没有办法将数据集转换为具有start_time(在点中第一次观察的时间)和end_time(在点+ 60min观察最后一次观察的时间)?

数据集有超过675000个观测值,但很多都是“可分组的” 这些是移动的veichles上的gps传感器,我每小时从它们收集信息,通过多次观察,veichles保持相同的位置。我想要做的是,对于每组观察(相同的id,几米范围内的相同位置,连续时间)生成一个新的数据帧,如果观察是“单一的”,则它具有start_time = time, end_time = time +60min if,on另一方面,有几个观察结果可以分组(如上例中的第106-130行)它应该有start_time = time of the first observation (1505376003 taking the aformentioned example), end_time = time of the last observation +60min (1505361603 +60min)

EDIT2:我能够识别(使用只有一个“ID”的子集),如果时间间隔是连续的(仍然无法理解为什么差异是以秒为单位而不是以小时为单位)c(NA,diff(round(as_datetime(df$time), units="hours"))==-3600)

我试着查看各种来源无济于事。

谢谢

1 个答案:

答案 0 :(得分:0)

按时间tmp <- arrange(df, time)

排列DF

创建一个索引来识别每个ID的“时间簇”(我将linux转换为datetime并将其四舍五入到更接近的整个小时)

run <- ddply(tmp, .(ID), transform, run=cumsum(c(1, diff(round(as_datetime(time), units="hours"))!=1)))

我将它包装起来,为组中的第一个和最后一个出现可能已更改的值(您可以选择使用均值,中位数或其他函数)

final <- ddply(run, .(ID, run), summarize, group_id=first(group_id), longs=first(longs), lats=first(lats), zone=first(zone), value1_start=first(value1), value1_end=last(value1), start_event=first(time), end_event=last(time))

结果很好,很整洁

coordinates   ID run group_id zone value1_start value1_end start_event  end_event
1 (9.22888, 45.52752) 30907   1        1     N/A            54          54  1496872804 1496872804
2  (9.2289, 45.52752) 30907   2        1     N/A            52          52  1496959205 1496959205
3 (9.20471, 45.47467) 30907   3        1       3            91          91  1497006004 1497006004
4 (9.20394, 45.46005) 30907   4        1       4            85          85  1497013203 1497016805
5 (9.22661, 45.48286) 30907   5        1      22            71          69  1497369603 1497387604
6 (9.22701, 45.47922) 30907   6        1      22            91          91  1497412804 1497412804