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中字符串到日期转换的格式? 请考虑以下 $ R --vanilla > as.Date("01 Jan 2000") Error in charToDate(x) : character string is not in a standard unambiguous format_R_Date_Date Formatting_Strptime_As.date - Fatal编程技术网

什么是「;标准明确日期“;R中字符串到日期转换的格式? 请考虑以下 $ R --vanilla > as.Date("01 Jan 2000") Error in charToDate(x) : character string is not in a standard unambiguous format

什么是「;标准明确日期“;R中字符串到日期转换的格式? 请考虑以下 $ R --vanilla > as.Date("01 Jan 2000") Error in charToDate(x) : character string is not in a standard unambiguous format,r,date,date-formatting,strptime,as.date,R,Date,Date Formatting,Strptime,As.date,但这一日期显然是标准的明确格式。为什么会显示错误消息 更糟糕的是,一个模棱两可的日期显然是在没有警告或错误的情况下被接受的,然后读取错误 > as.Date("01/01/2000") [1] "0001-01-20" 我在[R]标签中搜索并找到了包含此错误消息的28个其他问题。所有解决方案和解决办法都涉及到指定格式iiuc。这个问题的不同之处在于,我问的是,标准的无歧义格式在哪里定义,它们可以更改吗?是每个人都收到这些信息还是只有我?也许它与语言环境有关 换句话说,有没有比需要指定格式

但这一日期显然是标准的明确格式。为什么会显示错误消息

更糟糕的是,一个模棱两可的日期显然是在没有警告或错误的情况下被接受的,然后读取错误

> as.Date("01/01/2000")
[1] "0001-01-20"
我在[R]标签中搜索并找到了包含此错误消息的28个其他问题。所有解决方案和解决办法都涉及到指定格式iiuc。这个问题的不同之处在于,我问的是,标准的无歧义格式在哪里定义,它们可以更改吗?是每个人都收到这些信息还是只有我?也许它与语言环境有关

换句话说,有没有比需要指定格式更好的解决方案


这是记录在案的行为。从<代码>?截止日期<代码>:

格式:字符串。如果未指定,它将尝试 “%Y-%m-%d”然后在第一个非“NA”元素上的“%Y/%m/%d”, 如果两者都不起作用,则给出一个错误

as.Date(“2000年1月1日”)
产生错误,因为格式不是上面列出的两种格式之一
as.Date(“01/01/2000”)
产生错误的答案,因为日期不是上面列出的两种格式之一

我把“标准无歧义”理解为“ISO-8601”(尽管
as.Date
没有那么严格,因为“%m/%d/%Y”不是ISO-8601)

如果收到此错误,解决方案是使用
?strtime
中的详细信息部分中描述的格式指定日期(或日期时间)的格式


确保转换规范的顺序以及任何分隔符都与输入字符串的格式完全对应。此外,如果您的数据包含日/月名称和/或缩写,请务必特别小心,因为转换将取决于您的区域设置(请参见
?strtime
中的示例和read
?LC_TIME
;另请参见)。

作为@JoshuaUlrich answer的补充,以下是函数
as.Date.character
的定义:

as.Date.character
function (x, format = "", ...) 
{
    charToDate <- function(x) {
        xx <- x[1L]
        if (is.na(xx)) {
            j <- 1L
            while (is.na(xx) && (j <- j + 1L) <= length(x)) xx <- x[j]
            if (is.na(xx)) 
                f <- "%Y-%m-%d"
        }
        if (is.na(xx) || !is.na(strptime(xx, f <- "%Y-%m-%d", 
            tz = "GMT")) || !is.na(strptime(xx, f <- "%Y/%m/%d", 
            tz = "GMT"))) 
            return(strptime(x, f))
        stop("character string is not in a standard unambiguous format")
    }
    res <- if (missing(format)) 
        charToDate(x)
    else strptime(x, format, tz = "GMT")
    as.Date(res)
}
<bytecode: 0x265b0ec>
<environment: namespace:base>
as.Date.character
函数(x,格式=”,…)
{

charToDate在不指定当前格式的情况下转换日期会很容易地导致此错误

以下是一个例子:
sdate
换句话说,有没有比需要指定格式更好的解决方案

是的,由于软件包中的
anytime::anydate
,现在有了(即2016年底)

有关上面的一些示例,请参见以下内容:

R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10"))
[1] "2000-01-01" "2000-01-01" "2015-10-10"
R> 

正如你所说,这些事实上是明确无误的,应该可以使用。通过
anydate()
它们可以使用。没有格式。

这对我来说非常有效,不管之前的日期是如何编码的

library(lubridate)
data$created_date1 <- mdy_hm(data$created_at)
data$created_date1 <- as.Date(data$created_date1)
库(lubridate)

数据$created\u date1根据
作为.Date.character的函数定义判断,输入仅针对以下两种格式进行测试:
%Y-%m-%d”
%Y/%m/%d”
。如果它可以匹配其中一种,则似乎被认为是“明确的”。@CarlWitthoft“我读过吗?”似乎暗示着答案在
?as.Date
中是显而易见的。它对这有什么帮助?可以说是“1949年1月24日”和“1949年1月24日”这是明确的,但它们肯定是以盎格鲁语为中心的。然而,“month.abb”也有以盎格鲁语为中心的值,因此可以在以下情况下对这些值进行匹配:
strtime(xx,f@CarlWitthoft我们中的一些人偶尔会绊倒。谢谢你在我摔倒时踢我一脚。在这个问题上,我做对了很多事情:我包括了sessionInfo(),我搜索了,告诉了你我搜索的内容,并包含了一个链接,我尽可能地保留了它。我在?as.Date中漏掉了一行,你给了我TFM治疗。我们不可能一直都像你一样完美。@MatthewDowle如果我严厉批评的话,我很抱歉。我想当你看起来困惑的时候,浮华开始了“对一个受过良好教育的人来说是明确的”和“对一段可怜无助的代码来说是明确的”。-(@BenBolker
怎么样?)字符串不是%Y-%m-%d或%Y/%m/%d”
?这种行为肯定是以.Date
(+1)的形式记录的。但是,错误消息是“标准的明确格式”“具有讽刺意味的是,它的模糊性,前面的23个问题就证明了这一点。更直接的错误消息,如“格式未识别,请参阅文档”可能会改善用户体验。此外,我不认为“01/01/2000”是ISO-8601(“2000-01-01”是ISO-8601),这会增加模糊性。@jthetzel:你说得对,“01/2000”不是ISO-8601。我的意思是,我个人认为ISO-8601是标准的、明确的格式。我同意
as.Date
不抱怨“01/01/2000”与错误消息不一致。之所以来到这里,是因为我们遇到了另一个问题,即试图用不完整的格式解析日期。对于完整的日期,我们现在有了一些东西。我对此非常满意--这是一个烦人的问题。不用说,
anytime()
对POSIXct同样有用。只是使用了anytime软件包,它工作得很好,除了一些NAs。在对日期向量运行trimws()之后,一切都很完美。我也使用了一公吨!看起来很简单!我在字符串值为mm-dd(没有yy)的列上使用了anydate()。该列中的所有值都已成功转换为。不幸的是,它将年份设置为“1400”而不是“2020”_(ツ)_/“嗯,不完全是。正如我在这个网站上的其他几个问题中回答的那样,
mm dd
不是日期(mm yy或mm yyyy也不是)。你无法解析没有的内容。
date <- as.Date(sdate4) # ==> This will generate the same error"""Error in charToDate(x): character string is not in a standard unambiguous format""".
date <- as.Date(sdate4, format = "%Y.%m.%d") # ==> Error Free Date Conversion.
R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10"))
[1] "2000-01-01" "2000-01-01" "2015-10-10"
R> 
library(lubridate)
data$created_date1 <- mdy_hm(data$created_at)
data$created_date1 <- as.Date(data$created_date1)