无法使用as.Date格式化月份

时间:2011-09-20 05:21:36

标签: r date

我遗漏了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没有。

4 个答案:

答案 0 :(得分:16)

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

  

如果日期字符串未完全指定日期,则   返回的答案可能是系统特定的。最常见的行为   假设缺少的年,月或日是当前的。   如果它错误地指定了日期,那么可靠的实现将会   给出错误并将日期报告为“NA”。不幸   一些常见的实现(例如'glibc')是不可靠的   猜测意图。

当你考虑它时,严格来说,诸如“Mar / 1947”之类的术语并不是一个日期 - 它只是月份和年份的组合。日期是1947年3月(或任何其他月份+年份)的特定日期 - 因为您没有指定日期,所以您没有日期。

答案 1 :(得分:9)

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

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

答案 2 :(得分:0)

我不知道,但是当它是领先的领域时,%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"

答案 3 :(得分:-1)

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

因此,回到问题所在,当在给定的输入日期(即不完整的日期)中未提及日期(%d)时,它将无法在内部存储日期,从而导致“警告消息:NA引入强制”

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