web-dev-qa-db-ja.com

Rの文字列から日付への変換のための「標準の明確な日付」形式は何ですか?

以下を考慮してください

$ 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] standard unambiguous format」を含む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
79
Matt Dowle

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

形式:文字列。指定されていない場合、最初の非「NA」要素で「 "%Y-%m-%d"」、次に「 "%Y /%m /%d"」を試み、どちらも機能しない場合はエラーを返します。

as.Date("01 Jan 2000")は、形式が上記の2つのいずれでもないため、エラーになります。日付が上記の2つの形式のいずれでもないため、as.Date("01/01/2000")の答えは正しくありません。

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

このエラーを受け取った場合の解決策は、?strptimeで説明されている形式を使用して、日付(または日付時刻)の形式を指定することです。データに曜日/月の名前や略語が含まれる場合は、変換がロケールに依存するため、特に注意してください(?strptimeの例を参照し、?LC_TIMEをお読みください)。

60
Joshua Ulrich

@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をスローする場合、それはあいまいであり、あいまいでないと見なされます。

25
plannapus

言い換えれば、形式を指定する必要があるよりも良い解決策はありますか?

はい、 anytime パッケージの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()経由で実行します。フォーマットなし。

24

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

以下に例を示します。

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.
3

これは、以前に日付がどのようにコーディングされていたとしても、私にとって完璧に機能します。

library(lubridate)
data$created_date1 <- mdy_hm(data$created_at)
data$created_date1 <- as.Date(data$created_date1)
0
Viviana Wu