【问题标题】:Work with durations over 24 hours in R在 R 中使用超过 24 小时的持续时间
【发布时间】:2012-12-08 17:46:05
【问题描述】:

我有一系列最长可达 118 小时的持续时间,格式如“118:34:42”,其中 118 是小时,34 是分钟,42 是秒。输出应该是秒数。

我想将其转换为 R 中的某种时间类型,但我查看过的大多数库都想添加日期(lubridate、zoo、xts),或者由于时间原因返回“NA”超出 24 小时范围。我可以解析字符串并返回几秒钟,但我想知道是否有更快的方法。

我对 R 有点陌生(可能需要 3 个月才能使用它)。

任何有关如何处理此问题的帮助将不胜感激。

例子:

    library(lubridate)
    x <- c("118:34:42", "114:12:12")
    tt <- hms(x)
    Error in parse_date_time(hms, orders, truncated = truncated, quiet = TRUE) : 
  No formats could be infered from the training set.
    #try another route
    w <- "118:34:42"
    tt2 <- hms(w)
    tt2
    #[1] NA
    z <- "7:02:02"
    tt3 <- hmw(z)
    tt3
    #[1] "7H 2M 2S"

【问题讨论】:

  • 您可以将时间转换为秒:library(gsubfn); secs &lt;- c(strapply(x, "\\d+", as.numeric) %*% c(3600, 60, 1)),然后在几秒钟内完成所有处理。转换回来:sprintf("%d:%02d:%02d", secs %/% 3600, secs %/% 60 %% 60, secs %% 60)

标签: r duration time-format


【解决方案1】:

lubridate 包中有一个函数hms(),它返回一个时间对象:

library(lubridate)

x <- c("118:34:42", "114:12:12")
tt <- hms(x)

tt
[1] 118 hours, 34 minutes and 42 seconds 
[2] 114 hours, 12 minutes and 12 seconds 

函数hms()返回一个类Period的对象:

str(tt)
Formal class 'Period' [package "lubridate"] with 6 slots
  ..@ .Data : num [1:2] 42 12
  ..@ year  : num [1:2] 0 0
  ..@ month : num [1:2] 0 0
  ..@ day   : num [1:2] 0 0
  ..@ hour  : num [1:2] 118 114
  ..@ minute: num [1:2] 34 12

您可以使用这些对象进行算术运算。例如:

tt[2] - tt[1]
[1] -4 hours, -22 minutes and -30 seconds 

【讨论】:

  • 我仍然得到 NA 的上述。这是我收到的输出:'code' tt head(timecolumn) [1] "115:53:34" "7:13:27" "12:12:55" "3: 28:35" "3:05:23" "0:10:30" > 头部(tt) [1] NA "7H 13M 27S" "12H 12M 55S" "3H 28M 35S" "3H 5M 23S" "10M 30S "'代码'
  • @alplv 要跟踪这一点,您必须提供有关您的设置的更多信息,例如R 版本、Lubridate 版本等
  • 运行 Lubridate 1.20,R 2.15.2。我今天早上运行了一些更新,只是为了检查是否有任何包过期。现在正在尝试调试问题。去看看几个,看看我能不能从 Lubridate 帮助中找到任何东西。感谢您到目前为止的指点。
  • 尝试构建一个最小可重现的示例并将其发布到您的问题中,然后我也可以看看。
  • @Andrie,我认为您使用的是旧版本的 lubridate,因为我在 Vista 上使用 R 2.15.2 和 lubridate 1.2 获得大于 hms("24:00:00") 的 NA .0 以及来自 github 的 1.2.1。在 R 2.13 上使用 lubridate 0.2.5 我确实得到了非 NA 结果,所以它似乎只能在足够旧的版本中工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
相关资源
最近更新 更多