【问题标题】:R : using sapply for date objectsR:使用 sapply 日期对象
【发布时间】:2019-03-06 21:40:46
【问题描述】:

我正在操纵三个date objects (class : "POSIXlt" "POSIXt")。前两个向量(startend)定义了一些区间的起点和终点,第三个向量(inc)对应于一些事件。我想检测的是,哪个事件发生在哪个时间间隔内。我减小了向量的大小以提供一个工作示例。否则,向量的实际长度真的很大。

start <- c("2007-09-16 18:40:27 GMT","2007-09-28 23:53:55 GMT", "2007-10-25 05:23:01 GMT")
end <- c("2007-09-19 18:40:27 GMT", "2007-10-01 23:53:55 GMT","2007-10-28 05:23:01 GMT")
inc <- c("2007-09-17 18:45:00 GMT", "2007-09-17 19:00:00 GMT", "2007-09-17 19:15:00 GMT", "2007-09-17 19:30:00 GMT")

这是检测相应日期的简单代码:

quel.eve <- sapply( inc, function(s)
              which(start <= s & end >=s) )

当我使用 'which(start =2007-09-17 18:45:00 GMT)' 它工作正常并返回1。只有当我想应用“sapply”时才会出现问题。它给出了一些奇怪的结果:

$sec
integer(0)

$min
integer(0)

$hour
integer(0)

$mday
integer(0)

$mon
integer(0)

$year
integer(0)

$wday
integer(0)

$yday
integer(0)

$isdst
integer(0)

question 中,我发现由于“POSIXct”本质上已经是一个列表,“sapply”无法处理它。这里提供的向量元素是从我的控制台复制的,这就是它们类似于字符的原因。在我的程序中,它们绝对是“日期”对象。 有没有办法,将它们转换为POSIXct,这样做?我们将不胜感激。

【问题讨论】:

  • 数据必须是 date 对象(POSIXlt 类)。我不必将它们转换为character
  • 不,它们不是,我只是从控制台复制并粘贴了它们。这就是为什么他们在这里似乎是character。在我的控制台上class(start) 给出:"POSIXlt" "POSIXt"
  • 无法重现。就像@IceCreamToucan 所说,我所要做的就是将输入更改为start &lt;- as.POSIXlt(c("2007-09-16 18:40:27 GMT", etc)),其他的也一样。然后quel.evereturns [1] 1 1 1 1.

标签: r datetime sapply


【解决方案1】:

lubridate 包可以帮助解决这个问题。所有都需要转换为日期/时间对象,否则比较会将它们作为字符串进行比较,即“b”>“a”而不是间隔。下面是一个解决方案,我很困惑如何使用你的 start 和 end 向量。在您的示例中,每个 inc 值都将大于任何最小开始;并且对于每个 inc 小于任何最大端。所以不清楚这些是否意味着以某种方式成对?下面假设 start 为 min(start), end 为 max(end)。

同时 which() 将在没有值匹配时返回一个空整数。这也可能与开始/结束向量的交互方式有关:如果 inc 值大于第一个值而不是其他值,它将返回 TRUE FALSE FALSE,然后如果它小于结束值并返回 FALSE FALSE TRUE,则不会是 TRUE FALSE FALSE 和 FALSE FALSE TRUE 的联合,所以它总是返回空。

library(lubridate)
start <- c("2007-09-16 18:40:27 GMT","2007-09-28 23:53:55 GMT", "2007-10-25 05:23:01 GMT")
end <- c("2007-09-19 18:40:27 GMT", "2007-10-01 23:53:55 GMT","2007-10-28 05:23:01 GMT")
inc <- c("2007-09-17 18:45:00 GMT", "2007-09-17 19:00:00 GMT", "2007-09-17 19:15:00 GMT", "2007-09-17 19:30:00 GMT")

inc <- as_datetime(inc)
start <- min(as_date(start))
end <- max(as_datetime(end))

inc[which(inc >= start & inc <= end)]

> inc[which(inc >= start & inc <= end)]
[1] "2007-09-17 18:45:00 UTC" "2007-09-17 19:00:00 UTC" "2007-09-17 19:15:00 UTC" "2007-09-17 19:30:00 UTC"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    相关资源
    最近更新 更多