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

R 将日期时间转换为格式化的时间字符串,r,datetime,lubridate,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 [1] “14H 11M 49S” t格式(t,format=“%H:%M:%S”) [1] “14H 14M 49S” #预期产出

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

> 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
[1] “14H 11M 49S”
t格式(t,format=“%H:%M:%S”)
[1] “14H 14M 49S”
#预期产出:“14:14:49”
更新:

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

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

t问题在于
class(t)
是“Period”,而
format.Period()
函数没有
format=
的参数。
t
对象不是标准的
POSIXt
样式的对象,您可以将其与
format()
一起使用。只有
format.POSIXct()
format.POSIXlt()
函数的行为是这样的

因此,也许最简单的方法是定义一个helper函数,将
Period
类转换为
POSIXct
。我们可以通过以下方式做到这一点:

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

我必须承认我不是一个专家,所以我可能忽略了一个明显的功能,但将
lubridate
类格式化为“漂亮”格式的选项似乎非常有限。

不确定为什么需要转换为
hms
并返回初始字符串格式。也许
parse\u date\u 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"
基准输出:

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

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

> 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
>t sprintf(“%s:%s:%s”、小时(t)、分钟(t)、秒(t))
[1] “14:4:49”#看起来很奇怪
>格式(Sys.Date()+t,“%H:%M:%S”)
[1] “14:04:49”#看起来好多了

这看起来是个更好的主意。我考虑(偏执)字符串格式,在写入文本文件时为每个条目保存一些字节。然而,你的解决方案并没有达到我想要达到的目的。这行是
鸡蛋
问题:
POSIXct\u myTime很抱歉混淆了。我只把行
hms(“14:11:49”)
放在一个时间字符串中创建一个对象。我的工作流程是这样的:读取数百万条时间字符串;使用lubridate进行一些计算;将结果写回文本文件。请检查我更新的问题的开头。在这种情况下,我忘记了粘贴功能。但我希望有一种方法可以避免打电话给
hour
minute
second
。我的想法是:
lubridate
包显然非常擅长读取许多输入日期时间格式,但不太擅长将这些输出返回。不幸的是,
paste
解决方案将“04”打印为“4”。我使用
format
函数添加了一个简单的解决方法。这个解决方案可以工作,但需要额外的步骤来转换time to date\u time对象。无论如何,感谢您提到
format.POSIXct()
format.POSIXlt()
函数。您最初的问题是,您不知道它为什么不起作用,它并不是在寻求任何“解决方案”。如果这不是你真正的问题,那么我会尽量在将来更好地回答你的问题。我之所以进行转换,是因为您似乎真的想使用
格式
函数和
%H:%M:%S”
语法。
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
> 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