Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 无法使用as.Date设置月份格式_R_Date - Fatal编程技术网

R 无法使用as.Date设置月份格式

R 无法使用as.Date设置月份格式,r,date,R,Date,我在as.Date的“格式”部分遗漏了一些明显的内容。考虑这个例子 d1我不知道,但是%b在领先领域似乎不起作用 以下所有测试均失败(给出NA): 而当您在%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 De

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


d1我不知道,但是%b在领先领域似乎不起作用

以下所有测试均失败(给出NA):

而当您在%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"

最简单的答案是日期包含一天,如果没有指定一天,那么.date()就会混淆。从?截止日期文档:

如果日期字符串未完全指定日期,则 返回的答案可能是系统特定的。最常见的行为 是假定缺少的年、月或日是当前的年、月或日。 如果指定的日期不正确,则可靠的实现将失败 给出一个错误,日期报告为“NA”。不幸的是 一些常见的实现(如“glibc”)是不可靠的,并且 猜猜意图


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

这是因为您的
数据中的
d2
。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
d1$date2 d1
d d2日期1日期2
1947年1月1日1947年1月1947-01-01 1947-01-01
1947年2月2日1947年2月1947-02-01 1947-02-01
3 1947年3月1日1947年3月1947-03-01 1947-03-01
根据Cole Beck的文档“R中的处理日期时间”,在内部,日期保存为单个数值,该数值统计自参考日期1970-01-01以来经过的天数。 示例:1970-01-31将在内部保存为30

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


来源:

问题不在于%b是前导字段,而是缺少一天。如果不是“为什么”而是“如何”,那么答案应该是“
require(zoo);d1$date2 zoo包中的
“yearmon”
类可以处理没有天数的年/月。
> as.Date("1947", format="%Y")
[1] "1947-09-19"
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