无法使用POSIXct对象的保险杠-可能是由于小数秒?

时间:2019-02-12 21:11:37

标签: r overlap posixct

我有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,但不能完全弄清我需要在此基础上做些什么。

1 个答案:

答案 0 :(得分:1)

我在这里找到了我需要的Remove seconds from time in R

在创建SightingTime变量之后,但在创建“ SightingTime2”变量之前,我只需要四舍五入秒数。

Obs$SightingTime <- as.POSIXct(round(Obs$SightingTime, units="secs")) 

现在,当我做重叠时,我得到了3个重叠行。