我有2个数据表,我想使用保险杠找到重叠的行。我想我被绊倒了,因为某些日期只有几分之一秒。
library(data.table)
首先创建轮班时间数据表
On <- as.POSIXct(c("2017-08-01 00:05:54", "2017-08-01 00:07:20", "2017-08-01 00:21:53"), format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
Off <- as.POSIXct(c("2017-08-01 00:05:54", "2017-08-01 00:07:20", "2017-08-01 00:21:53"), format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
shifts <- data.table(On, Off)
现在创建观测时间数据表 第一组观察时间来自Matlab,因此需要先转换为POSIXct。这些最终给了我几分之一秒
timestamp <- c(736908.0041, 736908.0051, 736908.009, 736908.012, 736908.0152)
Obs = data.table(SightingTime = as.POSIXct((timestamp-719529)*86400, origin = "1970-01-01", tz = "UTC"))
#add a variable for the "date type"
Obs$DateType = "Long"
在数据表中添加没有小数秒的行(出于本示例的目的)
Obs <- rbind(Obs, data.table(SightingTime=as.POSIXct("2017-08-01 00:05:54", format = "%Y-%m-%d %H:%M:%S", tz = "UTC"), DateType = "Short"))
创建点间隔,以便可以使用保险杠
Obs[, SightingTime2 := SightingTime]
准备好碰碰
setkey(Obs, SightingTime, SightingTime2)
setkey(shifts, On, Off)
进行重叠联接
Obs.ov <- foverlaps(shifts, Obs ,type="any",nomatch=0L)
这导致Obs.ov中只有一行-与“短”日期格式重叠。日期格式为“长”的行不会包含在重叠中。我本来希望三行会重叠(假设小数秒会四舍五入,我也希望与00:05:54和00:21:53“长”时间戳重叠。
我认为这可能是由于我从Matlab转换的日期中的小数秒,但我不知道如何摆脱小数位。我确实尝试过使用
attributes(Obs$SightingTime)$format <- "%Y-%m-%d %H:%M:%OS"
,以及在早期从“ timestamp”变量创建SightingTime变量时包括“ format”参数。但是两者都没有运气。
我确实看过这里How to format fractional seconds in POSIXct in r,但不能完全弄清我需要在此基础上做些什么。
答案 0 :(得分:1)
我在这里找到了我需要的Remove seconds from time in R
在创建SightingTime变量之后,但在创建“ SightingTime2”变量之前,我只需要四舍五入秒数。
Obs$SightingTime <- as.POSIXct(round(Obs$SightingTime, units="secs"))
现在,当我做重叠时,我得到了3个重叠行。