107

以下をご検討ください

$ 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
4

7 に答える 7

71

これは文書化された動作です。から?as.Date:

format: 文字列。指定されていない場合は、'"%Y-%m-%d"' が試行され、次に最初の非 'NA' 要素で '"%Y/%m/%d"' が試行され、どちらも機能しない場合はエラーが発生します。

as.Date("01 Jan 2000")形式が上記の 2 つのいずれでもないため、エラーが発生します。 as.Date("01/01/2000")日付が上記の 2 つの形式のいずれでもないため、間違った答えが返されます。

「標準の明確な」は「ISO-8601」を意味します ( as.Date「%m/%d/%Y」は ISO-8601 ではないため、それほど厳密ではありません)。

このエラーが発生した場合の解決策は、 の詳細セクションで説明されている形式を使用して、日付 ​​(または日時) の形式を指定することです?strptime

変換指定の順序とセパレーターが入力文字列の形式と正確に一致していることを確認してください。また、変換はロケールに依存するため、データに日/月の名前および/または略語が含まれている場合は、特に注意してください ( の例を参照してください?strptime?LC_TIMEまたstrptime、予期しない値as.POSIXctas.Date返すNA)。

于 2013-02-07T16:10:55.000 に答える
38

言い換えれば、フォーマットを指定する必要があるよりも良い解決策はありますか?

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()彼らはそうします。フォーマットなし。

于 2016-11-20T21:32:25.790 に答える
27

@JoshuaUlrichの回答を補完するものとして、 function の定義を次に示します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、あいまいであると見なされ、明確ではない場合。

于 2013-02-07T16:19:41.410 に答える
6

現在の形式を指定せずに日付を変換すると、このエラーが簡単に発生する可能性があります。

次に例を示します。

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.
于 2015-12-19T20:42:44.453 に答える