我在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>
Run Code Online (Sandbox Code Playgroud)
所以我的问题很简单 - 我不明白为什么date1有效但date2没有.
nei*_*fws 16
最简单的答案是日期是包含一天的东西,如果没有指定,则.Date()会混淆.来自?as.Date文档:
如果日期字符串未完全指定日期,则返回的答案可能是特定于系统的.最常见的行为是假设缺少的年,月或日是当前的.如果它错误地指定了日期,则可靠的实现将给出错误,并且日期报告为"NA".不幸的是,一些常见的实现(例如'glibc')是不可靠的并且猜测了预期的含义.
当你想到它时,严格来说,诸如"Mar/1947"之类的术语并不是一个日期 - 它只是月份和年份的组合.日期是1947年3月(或任何其他月份+年份)的特定日期 - 由于您未指定日期,因此您没有日期.
这是因为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
Run Code Online (Sandbox Code Playgroud)