什么是“标准明确的日期”格式字符串到日期转换中的R?(What are the “standard

2019-07-19 14:26发布

请考虑以下

$ R --vanilla

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

但该日期显然一个明确的标准格式。 为什么错误信息?

更糟的是,不明确的日期显然是不接受警告或错误,然后读错!

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

我已经搜索,发现在含有该错误消息中的[R]标签28个的其他问题。 所有的解决方案和变通方法涉及指定格式,IIUC。 这个问题是在不同的我问在哪里无论如何定义的标准明确的格式,它们是否可以改变? 是否每个人都获得这些信息,还是只有我? 也许正是语言环境有关?

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

含“[R]标准明确的格式” 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

Answer 1:

这是记录的行为。 从?as.Date

格式:一个字符串。 如果没有指定,它会尝试“‘%Y-%间%d’”,然后“‘%Y /%M /%d’”的第一个非'NA”元素,并给出一个错误,如果没有作品。

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

我把“标准明确的”来表示“ISO-8601”(即使as.Date不是严格,如“%米/%d /%Y”不是ISO-8601)。

如果您收到此错误,解决的办法是指定格式的日期(或日期时间)在使用中所描述的格式?strptime 。 一定要使用特别小心,如果你的数据包含日/月的名称和/或缩写,作为转换将取决于您的区域设置(见例子?strptime和阅读?LC_TIME )。



Answer 2:

作为补充@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它被认为是不明确的,并且如果不明确的。



Answer 3:

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

是的,现在(即在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()他们这样做。 如果没有一种格式。



Answer 4:

不指定当前的格式转换的日期可以把这个错误给您轻松。

下面是一个例子:

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.


文章来源: What are the “standard unambiguous date” formats for string-to-date conversion in R?