将日期时间转换为格式化的时间字符串

时间:2014-09-04 14:00:17

标签: r datetime lubridate

我不知道为什么它不起作用。这是我的代码:

> t <- hms("14:11:49")
> t
[1] "14H 11M 49S"
t <- t + minutes(3)
> format(t, format="%H:%M:%S")
[1] "14H 14M 49S"
# Expected output: "14:14:49"

更新

目前我找到了这个解决方案,但我希望有一个更优雅的解决方案:

t <- hms("14:11:49") # example period object
sprintf("%s:%s:%s", hour(t), minute(t), second(t))
#"14:11:49"

3 个答案:

答案 0 :(得分:18)

不确定为什么需要转换为hms并返回初始字符串格式。也许parse_date_time函数就是您所需要的:

library(lubridate)
myTime <- "14:11:49"
hms(myTime)
#"14H 11M 49S"

POSIXct_myTime <- parse_date_time(myTime,"hms")
format(POSIXct_myTime, format="%H:%M:%S")
#"14:11:49"

修改 我们可以使用paste

t <- hms("14:11:49")
t
#[1] "14H 11M 49S"
t <- t + minutes(3)
t
#[1] "14H 14M 49S"

paste(hour(t),minute(t),second(t),sep=":")
#[1] "14:14:49"

基准输出:

op <- microbenchmark(
  Use_paste=paste(hour(t),minute(t),second(t),sep=":"),
  Use_sprintf=sprintf("%s:%s:%s", hour(t), minute(t), second(t)),
  times=1000000L)
op

# Unit: microseconds
# expr    min     lq median     uq      max neval
# Use_paste 28.072 31.695 32.601 33.506 44253.42 1e+06
# Use_sprintf 29.582 33.807 34.412 35.619 44367.52 1e+0

答案 1 :(得分:2)

问题是class(t)是&#34;期间&#34;并且format.Period()函数没有format=的参数。 t对象不是您可能习惯使用POSIXt的标准format()样式对象。只有format.POSIXct()format.POSIXlt()函数才会表现得那样。

因此,最简单的方法是定义一个辅助函数将Period类转换为POSIXct。我们可以这样做:

as.POSIXct.Period <- function(x, start=today()) {
    X<-as.interval(x, start); 
    X@.Data+X@start
}

值得注意的是,POSIXct是日期/时间值,而不仅仅是时间值。所以默认情况下我们假设它今天午夜开始。但是我们可以按照你想要的方式使用格式

format(as.POSIXct(t), format="%H:%M:%S")
# [1] "14:11:49"

我必须承认我不是专家lubridate用户,所以也许我忽略了一个明显的功能,但似乎可以选择将lubridate类格式化为&#34;漂亮&#34;格式非常有限。

答案 2 :(得分:0)

建议的解决方案不打印前导零。以下解决方案似乎更优雅:

> t <- hms("14:01:49") + minutes(3)
> sprintf("%s:%s:%s", hour(t), minute(t), second(t))
[1] "14:4:49" # looking weird
> format(Sys.Date() + t, "%H:%M:%S")
[1] "14:04:49" # looking better