2014-09-04 235 views
10

我不知道它为什么不起作用。这里是我的代码: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" 

回答

13

不知道为什么你需要转换为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

这似乎是一个更好的主意。 – MrFlick 2014-09-04 14:53:46

+0

我认为(偏执)字符串格式时,写入文本文件时为每个条目保存一些字节。然而你的解决方案并没有达到我想要达到的效果。这一行是'egg-egg'问题:'POSIXct_myTime < - parse_date_time(myTime,“hms”)'。我没有字符串格式的myTime。我读了数以百万计的'%H:%M:%S'格式的条目,对它们进行过滤并希望写回与输入完全相同的格式。 – biocyberman 2014-09-05 08:47:58

+0

“...字符串格式在写入文本文件时为每个条目保存一些字节...” - 不确定这是否为真...另外,“...我没有字符串格式的myTime .. 。“ - 在你的文章中你传递一个字符串给hms - 'hms(”14:11:49“)' – zx8754 2014-09-05 09:29:15

2

的问题是,class(t)是“期间“,format.Period()函数没有format=的参数。 t对象不是标准的POSIXt样式对象,您可能会习惯于使用format()。只有format.POSIXct()format.POSIXlt()函数的行为将如此。

所以也许最简单的做法是定义一个辅助函数将Period类变为POSIXct。我们可以做到这一点:

as.POSIXct.Period <- function(x, start=today()) { 
    X<-as.interval(x, start); 
    [email protected][email protected] 
} 

需要注意的是POSIXct是一个日期/时间值,不只是一个时间值是非常重要的。所以默认情况下,我们假设它在今天午夜开始。但是,我们可以使用格式你想

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

的方式,我必须承认,我不是专家lubridate用户所以也许我忽略了一个显而易见的功能,但它似乎选项用于格式化lubridate类分为“漂亮“的格式非常有限。

+0

此解决方案,但需要将时间转换为数据的额外步骤e_time对象。无论如何,感谢提及'format.POSIXct()'和'format.POSIXlt()'函数。 – biocyberman 2014-09-05 13:25:41

+1

那么,你原来的问题只是你不知道为什么它不起作用,它并不是要求任何东西的“解决方案”。如果这不是你真正的问题,那么我会尽力在未来提出你的问题。我只进行了转换,因为您似乎确实希望使用格式函数和'“%H:%M:%S”'语法。 – MrFlick 2014-09-05 13:30:07

相关问题