【问题标题】:Convert numeric values to dates将数值转换为日期
【发布时间】:2014-12-31 08:11:39
【问题描述】:

我有一个如下的数值向量

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. 

我想避免在这种情况下粘贴“0”。是否有任何其他(直接)替代方法可以一次将数值转换为日期?

【问题讨论】:

标签: r date datetime zoo lubridate


【解决方案1】:

可以使用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"

【讨论】:

    【解决方案2】:

    根据您的平台,您可以使用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。

    【讨论】:

    • 我将前两个作为 NA。 0 没有被粘贴。如果您只运行 `sprintf("%08s", aa)' 它只会添加空格而不是零。
    • @user3664020 我明白了。我的机器上没有。让我检查一下。
    • 这很奇怪。当我运行sprintf("%08s", aa) 时,我得到一个向量" 1022011" " 2022011" "13022011" "23022011"
    • @user3664020 这个as.Date(sprintf("%08s", as.character(aa)), format = "%d%m%Y")怎么样?你能告诉我发生了什么吗?
    • @jazzurro 实际上这是可行的:sprintf("%08i",aa)...(在 Windows 7 上)
    【解决方案3】:

    您可以在lubridate 中使用dmy

    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"
    

    【讨论】:

    • 这不适用于格式为 mmddyyyy 的aa &lt;- c(1022011, 2232011, 12232011, 2272011)。返回错误的值。我们不能以某种方式指定dmy 中的格式吗?
    • 是的。 mdy 工作。总是很高兴知道新功能。
    • @Ben Bolker 谢谢。 @user3664020 lubridate 有很多类似上面的有用函数,比如ymd_hms 和类似的日期时间类枚举。
    • @nrussell as.Date(mdy(aa)) 给了我aa 中第三个和第四个元素的有趣日期(即“2012-01-02”“2062-10-21”)。您似乎对这些元素还有其他日期。你对这种有趣的行为有什么猜测吗?
    • @jazzurro 我不知道为什么你的机器上会发生这种情况,我只是在我的示例中使用aa 向量重新运行as.Date(mdy(aa))as.Date(dmy(aa)),它返回了正常日期。
    【解决方案4】:

    我知道您不想添加“0”,但在基础 R 中,这仍然有效:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2020-04-24
      相关资源
      最近更新 更多