r - 将 foverlaps 与 POSIXct 对象一起使用时遇到问题 - 可能是由于小数秒?

标签 r overlap posixct

我有 2 个数据表,我想使用 foverlaps 找到重叠的行。我想我被绊倒了,因为有些日期有小数秒。

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"))

创建点间隔以便可以使用 foverlaps

Obs[, SightingTime2 := SightingTime]

准备好foverlaps

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 ,但不太清楚我需要在此基础上进行哪些更改。

最佳答案

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

我只需要在创建 SightingTime 变量之后、创建“SightingTime2”变量之前对秒数进行四舍五入。

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

现在,当我进行重叠时,我得到了预期的 3 个重叠行。

关于r - 将 foverlaps 与 POSIXct 对象一起使用时遇到问题 - 可能是由于小数秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54658755/

相关文章:

r - R 语言的工作原理

r - 如何根据 R 中的后续日期时间行创建条件语句

r - 使用 GGPLOT 创建 ROC 曲线

r - 将 POSIXct 对象传递给函数返回数值向量

r - 从 R 中的 POSIXct 中提取 2 位数小时

r - 基于 r 中给定距离的 5 个最近邻

SQL - 合并重叠数据

c++ - 如何检测两个正则表达式在它们可以匹配的字符串中是否重叠?

php - 如何找到重叠的日期范围之间的其余部分

r - POSIXct 对象是 NA,但 is.na() 返回 FALSE