【问题标题】:Unable to format months with as.Date无法使用 as.Date 格式化月份
【发布时间】:2011-09-20 05:21:36
【问题描述】:

我在 as.Date 的“格式”部分遗漏了一些明显的东西。考虑这个例子

d1 <- data.frame(d = c("1/Jan/1947", "1/Feb/1947", "1/Mar/1947"), d2 = c("Jan/1947", "Feb/1947", "Mar/1947"))

d1$date1 <- as.Date(x=d1$d, format="%d/%b/%Y")
d1$date2 <- as.Date(x=d1$d2, format="%b/%Y")

           d       d2      date1 date2
1 1/Jan/1947 Jan/1947 1947-01-01  <NA>
2 1/Feb/1947 Feb/1947 1947-02-01  <NA>
3 1/Mar/1947 Mar/1947 1947-03-01  <NA>

所以我的问题很简单——我不明白为什么 date1 有效但 date2 无效。

【问题讨论】:

  • 如果你问的是“如何”而不是“为什么”,那么答案应该是“require(zoo); d1$date2 &lt;- as.yearmon(d1$d2, format="%b/%Y")
  • zoo 包中的"yearmon" 类可以处理年/月,没有天。

标签: r date


【解决方案1】:

最简单的答案是日期是包含一天的东西,如果没有指定, as.Date() 会混淆。来自 ?as.Date 文档:

如果日期字符串没有完全指定日期,则 返回的答案可能是系统特定的。最常见的行为 是假设缺少的年、月或日是当前的。 如果它错误地指定了一个日期,可靠的实现将 给出一个错误,日期报告为“NA”。很遗憾 一些常见的实现(例如“glibc”)是不可靠的,并且 猜测预期的意思。

仔细想想,严格来说,诸如“Mar/1947”之类的词并不是一个日期——它只是月份和年份的组合。日期是 1947 年 3 月(或任何其他月份 + 年份)中的特定日期 - 因为您没有指定日期,所以您没有日期。

【讨论】:

    【解决方案2】:

    这是因为您的data.frame 中的d2 日期格式错误。它不包含一天。为了解决这个问题,请考虑使用以下内容:

    d1$date2 <- as.Date(x=paste("1/",d1$d2, sep=""), format="%d/%b/%Y")
    > d1
               d       d2      date1      date2
    1 1/Jan/1947 Jan/1947 1947-01-01 1947-01-01
    2 1/Feb/1947 Feb/1947 1947-02-01 1947-02-01
    3 1/Mar/1947 Mar/1947 1947-03-01 1947-03-01
    

    【讨论】:

      【解决方案3】:

      我不知道,但是当它是领先领域时,%b 似乎不起作用。

      以下都失败(给出NA):

      > as.Date("Jan/1947", format="%b/%Y")
      > as.Date("Jan 1947", format="%b %Y")
      > as.Date("jan1947", format="%b%Y")
      > as.Date("Jan1947", format="%b%Y")
      

      而当您在 %b 前面加上 %d 时,它会起作用:

      > as.Date("1Jan1947", format="%d%b%Y")
      > as.Date("29-Jan-1947", format="%d-%b-%Y")
      > as.Date("08/Aug/1947", format="%d/%b/%Y")
      > as.Date("22 Dec 1947", format="%d %b %Y")
      

      似乎 neilfws 有关于不完整性的答案。 这也可以解释为什么只给出年份:

      > as.Date("1947", format="%Y")
      [1] "1947-09-19"
      

      【讨论】:

      • 问题不在于 %b 是前导字段,而是缺少一天。
      【解决方案4】:

      根据 Cole Beck 的文档“在 R 中处理日期时间”,在内部将日期保存为单个数值,该数值计算自参考日期 1970 年 1 月 1 日以来经过的天数。 示例:1970-01-31 将在内部保存为 30。

      所以,回到问题上来,当给定的输入日期(即不完整的日期)中没有提到某一天 (%d) 时,它无法在内部存储日期,从而导致“警告消息:NAs强制”

      来源:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/ColeBeck/datestimes.pdf

      【讨论】:

        猜你喜欢
        • 2012-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        相关资源
        最近更新 更多