【问题标题】:Group and subset time组和子集时间
【发布时间】:2015-01-23 15:32:10
【问题描述】:

我在数据框中有时间数据,如下所示:

          date day       time      phone      lat      lon acc       update
6   12/08/2014 Tue 07:25:35PM 9052780809 17.41653 78.40537 3.9 1.406988e+12
44  12/08/2014 Tue 07:26:35PM 9052780809 17.41823 78.40344 3.9 1.406988e+12
114 12/08/2014 Tue 07:28:32PM 9052780809 17.41810 78.39846 3.9 1.406988e+12
152 12/08/2014 Tue 07:29:30PM 9052780809 17.41760 78.39512 3.9 1.406988e+12
188 12/08/2014 Tue 07:30:31PM 9052780809 17.41517 78.39426 3.9 1.406988e+12
223 12/08/2014 Tue 07:31:30PM 9052780809 17.41467 78.39434 3.9 1.406988e+12

大多数时间相差 1-2 分钟,但也有介于两者之间的情况,例如在第二次阅读后相差超过 10 分钟。如果它们之间的差异超过 10 分钟,则连续读数可能在不同的日期。我想在读取间隔超过 10 分钟后插入一个中断,并将它们插入另一个数据帧以进一步处理它们。

             date day       time      phone      lat      lon acc       update
145315 16/08/2014 Sat 11:54:57AM 9052780809 17.41377 78.45923 3.9 1.406988e+12
145371 16/08/2014 Sat 11:55:56AM 9052780809 17.41626 78.45750 3.9 1.406988e+12
145426 16/08/2014 Sat 11:56:55AM 9052780809 17.41746 78.45547 4.0 1.406988e+12
162349 16/08/2014 Sat 05:02:51PM 9052780809 17.41562 78.44446 3.9 1.406988e+12
162404 16/08/2014 Sat 05:03:55PM 9052780809 17.41577 78.44113 3.9 1.406988e+12
162452 16/08/2014 Sat 05:04:51PM 9052780809 17.41638 78.43815 3.9 1.406988e+12

原始数据有 8 列,超过 700000 行。

【问题讨论】:

  • 将数据转成POSIXct,然后使用difftime()。
  • ... 然后你可以 split 只要 difftime > X 分钟
  • 试试dt1 <- strptime(time1, format='%I:%M:%OS%p');split(time1, cumsum(c(FALSE,difftime(dt1[-length(dt1)], dt1[-1], unit='min')>10)))
  • @SuryaPavanPynda 请检查更新是否有帮助。

标签: r dataframe subset


【解决方案1】:

只是从 cmets 粘贴,以便问题得到解答。您可以使用split(由@docendo discimus 建议)和difftime(来自@Laurik)来获取预期的数据集。

假设“time1”是数据集中的“时间”列(“dat”),使用strptime将“time1”转换为“POSIXlt”类,使用difftime得到“分钟”之间的差异连续元素。在这里,我删除了最后一个元素和第一个元素,以便我们可以找到当前dt1[-length(dt1)]和下一个元素dt1[-1]之间的区别,应用条件>10cumsum逻辑索引和split数据集基于该索引以获取 data.frames (lst) 的列表。在列表中工作可能比创建单独的 data.frame 对象更好。

dt1 <- strptime(dat$time1, format='%I:%M:%OS%p')
lst <- split(dat, cumsum(c(FALSE,difftime(dt1[-length(dt1)],
                            dt1[-1], unit='min')>10)))

更新

使用新数据集dat

 dt1 <- with(dat, strptime(paste(date, time),
                     format='%d/%m/%Y %I:%M:%OS%p'))

 indx <- cumsum(c(FALSE, abs(difftime(dt1[-length(dt1)], dt1[-1], 
       unit='min')) >10))
 split(dat, indx)
 #$`0`
 #        date day       time      phone      lat      lon acc       update
 #6   12/08/2014 Tue 07:25:35PM 9052780809 17.41653 78.40537 3.9 1.406988e+12
 #44  12/08/2014 Tue 07:26:35PM 9052780809 17.41823 78.40344 3.9 1.406988e+12
 #114 12/08/2014 Tue 07:28:32PM 9052780809 17.41810 78.39846 3.9 1.406988e+12
 #152 12/08/2014 Tue 07:29:30PM 9052780809 17.41760 78.39512 3.9 1.406988e+12
 #188 12/08/2014 Tue 07:30:31PM 9052780809 17.41517 78.39426 3.9 1.406988e+12
 #223 12/08/2014 Tue 07:31:30PM 9052780809 17.41467 78.39434 3.9 1.406988e+12

 #$`1`
 #           date day       time      phone      lat      lon acc       update
 #145315 16/08/2014 Sat 11:54:57AM 9052780809 17.41377 78.45923 3.9 1.406988e+12
 #145371 16/08/2014 Sat 11:55:56AM 9052780809 17.41626 78.45750 3.9 1.406988e+12
 #145426 16/08/2014 Sat 11:56:55AM 9052780809 17.41746 78.45547 4.0 1.406988e+12

#$`2`
#            date day       time      phone      lat      lon acc       update
#162349 16/08/2014 Sat 05:02:51PM 9052780809 17.41562 78.44446 3.9 1.406988e+12
#162404 16/08/2014 Sat 05:03:55PM 9052780809 17.41577 78.44113 3.9 1.406988e+12
#162452 16/08/2014 Sat 05:04:51PM 9052780809 17.41638 78.43815 3.9 1.406988e+12

数据

dat <-     structure(list(date = c("12/08/2014", "12/08/2014", "12/08/2014", 
 "12/08/2014", "12/08/2014", "12/08/2014", "16/08/2014", "16/08/2014", 
 "16/08/2014", "16/08/2014", "16/08/2014", "16/08/2014"), day = c("Tue", 
 "Tue", "Tue", "Tue", "Tue", "Tue", "Sat", "Sat", "Sat", "Sat", 
 "Sat", "Sat"), time = c("07:25:35PM", "07:26:35PM", "07:28:32PM", 
 "07:29:30PM", "07:30:31PM", "07:31:30PM", "11:54:57AM", "11:55:56AM", 
 "11:56:55AM", "05:02:51PM", "05:03:55PM", "05:04:51PM"), phone = c(9052780809, 
 9052780809, 9052780809, 9052780809, 9052780809, 9052780809, 9052780809, 
 9052780809, 9052780809, 9052780809, 9052780809, 9052780809), 
 lat = c(17.41653, 17.41823, 17.4181, 17.4176, 17.41517, 17.41467, 
 17.41377, 17.41626, 17.41746, 17.41562, 17.41577, 17.41638
 ), lon = c(78.40537, 78.40344, 78.39846, 78.39512, 78.39426, 
 78.39434, 78.45923, 78.4575, 78.45547, 78.44446, 78.44113, 
 78.43815), acc = c(3.9, 3.9, 3.9, 3.9, 3.9, 3.9, 3.9, 3.9, 
 4, 3.9, 3.9, 3.9), update = c(1.406988e+12, 1.406988e+12, 
 1.406988e+12, 1.406988e+12, 1.406988e+12, 1.406988e+12, 1.406988e+12, 
 1.406988e+12, 1.406988e+12, 1.406988e+12, 1.406988e+12, 1.406988e+12
 )), .Names = c("date", "day", "time", "phone", "lat", "lon", 
 "acc", "update"), class = "data.frame", row.names = c("6", "44", 
 "114", "152", "188", "223", "145315", "145371", "145426", "162349", 
 "162404", "162452"))

【讨论】:

  • 代码中的错误。它仅在时间来自不同日期时才有效。如果时间来自同一天,它似乎不会将它们分开。 [43] “10:19:13AM” “10:20:12AM” “10:21:11AM” “10:22:12AM” “10:23:15AM” “10:24:11AM” “10:25: 12AM" [50] "10:26:12AM" "10:27:12AM" "10:28:12AM" "10:29:12AM" "10:30:11AM" "10:31:12AM" "10: 32:11AM" [57] "10:33:12AM" "10:34:14AM" "02:32:27PM" "02:33:27PM" "02:34:27PM" "02:35:28PM" "下午 2 点 37 分 27 秒”[64]“下午 2 点 38 分 28 秒”“下午 2 点 39 分 28 秒”“下午 2 点 40 分 28 秒”“下午 2 点 41 分 27 秒”“下午 2 点 42 分 28 秒”“下午 2 点 43 分 27 秒” " "02:44:27PM" [71] "02:45:27PM" "02:47:30PM" "02:48:28PM" "02:49:27PM"
  • @SuryaPavanPynda 请使用新示例和预期输出更新您的帖子。你有日期栏吗?在这种情况下,请务必在您的帖子中而不是在 cmets 中显示(因为很难正确获取格式)。此外,使用 dput 显示数据子集。 IE。 dput(head(data))
  • 进行了更改。请现在看看。谢谢
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多