【问题标题】:How to match time in R, ignoring seconds? (unexpected behavior of match/trunc)如何在 R 中匹配时间,忽略秒? (匹配/截断的意外行为)
【发布时间】:2016-10-10 15:44:19
【问题描述】:

我有一个时间戳列表——每分钟一个加上几秒。现在我想使用 R 在该列表中查找参考时间,仅考虑日期+小时+分钟而忽略秒数。

library(lubridate)
data <- c(
  "2016-10-09T23:05:01",
  "2016-10-09T23:06:01",
  "2016-10-09T23:07:01",
  "2016-10-09T23:08:01",
  "2016-10-09T23:10:10",
  "2016-10-09T23:11:01",
  "2016-10-09T23:12:01",
  "2016-10-09T23:13:04",
  "2016-10-09T23:14:02",
  "2016-10-09T23:15:03",
  "2016-10-09T23:16:10"
  )
dataParsed <- ymd_hms(data[])
refTime <- ymd_hms("2016-10-09T23:15:00")

我尝试使用trunc(..., "mins")match() 的组合来查找所需时间的索引。但是,这会产生一些意想不到的结果:

以下内容应在“2016-10-09T23:15:03”处找到条目索引,但结果却是idx==NA_integer

idx <- match(trunc(refTime,"mins"), trunc(dataParsed,"mins"))

奇怪的是,以下(将输入削减为 10 个时间戳)在 idx==9 处找到搜索时间。

idx <- match(trunc(refTime,"mins"), trunc(tail(dataParsed,10),"mins"))

显然,我对 trunc(..., "mins")match() 所做的事情犯了一些错误或有一些错误的假设。

版本信息
R 版本 3.3.1 (2016-06-21)
平台:x86_64-w64-mingw32/x64(64位)
在Win10上运行

【问题讨论】:

    标签: r time match lubridate


    【解决方案1】:

    发生错误的原因是因为您的时间存储为POSIXlt 对象,并且(出于某种原因)match 不起作用。

    你可以:

    1. 转换为POSIXct对象
    2. 使用pmatchwhich

    使用POSIXct

    区别在于POSIXlt是一个列表POSIXct是一个数字

    idx <- match(as.POSIXct(trunc(refTime,"mins")), as.POSIXct(trunc(dataParsed,"mins")))
    #> [1] 10
    

    使用pmatchwhich

    您可以使用pmatch 代替match,也可以使用which 进行相等测试。

    pmatch(trunc(refTime,"mins"), trunc(dataParsed,"mins"))
    #> [1] 10
    

    which:

    which(trunc(dataParsed,"mins") == trunc(refTime,"mins"))
    #> [1] 10
    

    【讨论】:

    • 我更喜欢pmatchwhich 的解决方案,因为它们不需要显式的转换步骤并且在源代码中更易于阅读。
    • IMO,which 对您来说可能是最“自然”的,因为您的代码(即最清楚地传达了意图)。
    • 是的,同意。 which 使意图非常明显。但是,需要考虑到,如果有多个匹配值,它可能会返回一个列表。
    • 正确:您可以使用which(trunc(dataParsed,"mins") == trunc(refTime,"mins"))[[1]] 强制第一个或单独处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多