将数值转换为日期

时间:2014-11-04 12:25:56

标签: r date datetime zoo lubridate

我有一个数字向量如下

aa <- c(1022011, 2022011, 13022011, 23022011) (this vector is just a sample, it is very long)

值的编写方式是第一个值是日,然后是月,然后是年。

我现在正在做的是

as.Date(as.character(aa), %d%m%Y")

但是,

在单位数字日数的情况下引起问题(返回NA)。 (即1022011,2022011)。

所以基本上

as.Date("1022011", "%d%m%Y") does not work

as.Date("01022011", "%d%m%Y")  (pasting '0' ahead of the number) works. 

我想避免粘贴&#39; 0&#39;在这种情况下。有没有其他(直接)替代方法可以一次将数值转换为日期?

4 个答案:

答案 0 :(得分:5)

可以使用sub进行重新排列,在这种情况下,没有格式的普通as.Date有效:

x <- c(1022011, 11022011) # test data

pat <- "^(..?)(..)(....)$"
as.Date(sub(pat, "\\3-\\2-\\1", x))

,并提供:

[1] "2011-02-01" "2011-02-11"

答案 1 :(得分:3)

根据您的平台,您可以使用sprintf以便在开头添加零。似乎Mac对此没问题,但是在与OP的讨论中没有Windows 7。

aa <- c(1022011, 2022011, 13022011, 23022011)

as.Date(sprintf("%08s", aa), format = "%d%m%Y")

[1] "2011-02-01" "2011-02-02" "2011-02-13" "2011-02-23"

<强>更新

@CathyG提到sprintf("%08i",aa)适用于Windows 7。

答案 2 :(得分:3)

您可以在dmy中使用lubridate

library(lubridate)
aa <- c(1022011, 2022011, 13022011, 23022011)
> dmy(aa)
[1] "2011-02-01 UTC" "2011-02-02 UTC" "2011-02-13 UTC" "2011-02-23 UTC"

如果您不想将时区包装在as.Date

> as.Date(dmy(aa))
[1] "2011-02-01" "2011-02-02" "2011-02-13" "2011-02-23"

谢谢@Ben Bolker,

> as.Date(mdy(aa))
[1] "2011-01-02" "2011-02-02" "2012-01-02" "2011-01-02"

答案 3 :(得分:1)

我知道你不想添加&#34; 0&#34;但是,在基础R中,这仍然有效:

as.Date(sapply(aa,function(x){ifelse(nchar(x)==8,x,paste("0",x,sep=""))}),format = "%d%m%Y")