什么是“标准明确的date”格式?

请考虑以下事项

$ R --vanilla > as.Date("01 Jan 2000") Error in charToDate(x) : character string is not in a standard unambiguous format 

但是那个date显然是以一种标准的明确格式。 为什么错误信息?

更糟糕的是,一个模棱两可的date显然接受没有警告或错误,然后错误地阅读!

 > as.Date("01/01/2000") [1] "0001-01-20" 

我在包含这个错误信息的[R]标签中search了28个其他的问题。 所有的解决scheme和解决方法都涉及指定格式,iiuc。 这个问题是不同的,因为我问无论如何定义了标准的明确的格式,它们可以改变吗? 每个人都可以得到这些消息还是只是我? 也许是语言环境相关?

换句话说,是否有比需要指定格式更好的解决scheme?

29个包含“标准明确格式”的问题

 > sessionInfo() R version 2.15.2 (2012-10-26) Platform: x86_64-w64-mingw32/x64 (64-bit) locale: [1] LC_COLLATE=English_United Kingdom.1252 [2] LC_CTYPE=English_United Kingdom.1252 [3] LC_MONETARY=English_United Kingdom.1252 [4] LC_NUMERIC=C [5] LC_TIME=English_United Kingdom.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base 

这是logging的行为。 从?as.Date

格式:一个string。 如果没有指定,则会在第一个非'NA'元素上尝试''%Y-%m-%d'',然后''%Y /%m /%d'',如果两者都不起作用,则会报错。

as.Date("01 Jan 2000")产生一个错误,因为格式不是上面列出的两个之一。 as.Date("01/01/2000")产生不正确的答案,因为date不是上面列出的两种格式之一。

我认为“标准毫不含糊”的意思是“ISO-8601”(即使as.Date不那么严格,因为“%m /%d /%Y”不是ISO-8601)。

如果您收到此错误,解决scheme是使用?strptime描述的格式指定date(或date时间)的格式。 如果您的数据包含日/月份名称和/或缩写,请务必特别小心,因为转换将取决于您的语言环境(请参阅“ ?strptime?LC_TIME的示例)。

作为@JoshuaUlrich答案的补充,下面是函数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> 

所以基本上,如果strptime(x, format="%Y-%m-%d")strptime(x, format="%Y/%m/%d")抛出一个NA ,则认为是不明确的,如果不是明确的。

换句话说,是否有比需要指定格式更好的解决scheme?

是的,现在(即在2016年底), anytime::anydate 随时随地的包装。

从上面的一些例子看下面的内容:

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

正如你所说,这些其实是毫不含糊的 ,应该是有效的。 并通过anydate()他们做。 没有格式。

在不指定当前格式的情况下转换date会给您带来这个错误。

这里是一个例子:

 sdate <- "2015.10.10" 

转换时不指定格式:

 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.