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

发布于 2024-12-05 05:26:59 字数 646 浏览 0 评论 0原文

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

d1 <- data.frame(d = c("1/Jan/1947", “1947 年 2 月 1 日”, “1947 年 3 月 1 日”), d2 = c("1947 年 1 月", “1947 年 2 月”, "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 无效。

I'm missing something obvious with the "format" section of as.Date. Consider this example

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>

so my question is really simple -- I don't understand why the date1 works but date2 doesn't.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

相权↑美人 2024-12-12 05:26:59

最简单的答案是日期是包含一天的内容,如果未指定日期,则 as.Date() 会感到困惑。来自 ?as.Date 文档:

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

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

The simplest answer is that a date is something which includes a day and if one is not specified, as.Date() gets confused. From the ?as.Date documentation:

If the date string does not specify the date completely, the
returned answer may be system-specific. The most common behaviour
is to assume that a missing year, month or day is the current one.
If it specifies a date incorrectly, reliable implementations will
give an error and the date is reported as ‘NA’. Unfortunately
some common implementations (such as ‘glibc’) are unreliable and
guess at the intended meaning.

When you think about it, a term such as "Mar/1947" is not, strictly speaking, a date - it's just a combination of month and year. A date is a specific day in March 1947 (or any other month + year) - since you don't specify one, you don't have a date.

与风相奔跑 2024-12-12 05:26:59

这是因为 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

It is because d2 in your data.frame is a malformed date. It doesn't contain a day. To get round this, consider using the following:

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
み青杉依旧 2024-12-12 05:26:59

我不知道,但是 %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"

I don't know, but %b doesn't seem to work when it's the leading field.

The following all fail (give 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")

whereas when you precede %b with %d, it works:

> 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")

Seems like neilfws has the answer about incompleteness.
This would also explain why giving only the year gives:

> as.Date("1947", format="%Y")
[1] "1947-09-19"
感悟人生的甜 2024-12-12 05:26:59

根据 Cole Beck 的文档“Handling date-times in R”,日期在内部保存为单个数值,该数值计算自参考日期 1970-01-01 以来经过的天数。
示例:1970-01-31 将在内部保存为 30。

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

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

As per the document,"Handling date-times in R" by Cole Beck, internally a date is saved as a single numeric value, which counts the number of days passed since a reference date, 1970-01-01.
Example: 1970-01-31 will be saved internally as 30.

So, coming back to the problem, when a day (%d) is not mentioned in the given input date (i.e., an incomplete date), it cannot store the date internally, resulting in "Warning message: NAs introduced by coercion"

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文