让R识别“41520092010”为“04/15/2009 20:10”的最有效方法

时间:2016-05-02 19:25:44

标签: r datetime

我需要通过在数据集中使用开始和结束时间变量来查找大量事件的持续时间,但两个变量都以烦人的格式“mmddyyyyhhmm”编码时间,顶部的樱桃是前九个月编码为单个数字(1月为“1”而不是“01”)。至少时间使用二十四个时钟(假设人们填写每个事件做得对)。

我知道必须有一个相当简单的方法来做到这一点,但我想不出一个并且怀疑你们中的一个好人们记住它并且可以在几秒钟内写出来。

2 个答案:

答案 0 :(得分:3)

一种可能性是将stringr库与lubridate库结合使用:

DatesAndTimes <- c("41520092010","121520092010")
library(stringr)
library(lubridate)
mdy_hm(str_pad(DatesAndTimes, 12, side="left", pad="0"))
#[1] "2009-04-15 20:10:00 UTC" "2009-12-15 20:10:00 UTC"

答案 1 :(得分:2)

如果你有一个带有转换字符值的向量x ......

x <- c("41520092010", "11520092010", "121520092010")

...你可以检查这个向量是否有11个字符(或其他)。如果一个元素有11个字符,我们在前面粘贴一个零,然后将整个矢量转换为POSIXt。

as.POSIXct(
    ifelse(nchar(x) == 11, paste0("0", x), x), 
    format = "%m%d%Y%H%M",
    tz = "UTC"
)
# [1] "2009-04-15 20:10:00 UTC" "2009-01-15 20:10:00 UTC" 
# [3] "2009-12-15 20:10:00 UTC"

如果您不喜欢ifelse(),可以使用replace()

replace(x, nchar(x) == 11, paste0("0", x[nchar(x) == 11]))

formatC()

formatC(as.numeric(x), digits = 12, width = 12, flag = "0")

最有效的可能是formatC()