R에서 문자열-날짜 변환을위한 "표준 명확한 날짜"형식은 무엇입니까?


94

다음을 고려하십시오

$ 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

13
as.Date.character입력 의 함수 정의로 판단하는 것은 다음 두 형식에 대해서만 테스트됩니다 : "%Y-%m-%d""%Y/%m/%d". 그들 중 하나와 일치 할 수 있으면 "모호하지 않은"것으로 간주됩니다.
plannapus 2013

7
@CarlWitthoft "내가 읽었 는가"는 대답이에서 맹목적으로 분명하다는 것을 암시하는 것 같습니다 ?as.Date. 이것이 어디에서 도움이됩니까?
Matt Dowle 2013

2
틀림없이 "1949 년 1 월 24 일"과 "1949 년 1 월 24 일"은 모호하지 않지만 확실히 앵글로 중심적입니다. 그러나 Anglo 중심의 'month.abb'에 대한 값도 있으므로 : strptime(xx, f <- "%d $B %Y", tz = "GMT")또는 strptime(xx, f <- "%B $d %Y", tz = "GMT")반환 된 값의 경우 해당 값이 일치하도록 케이스를 만들 수 있습니다 . (나는 암시하고 있지 않다 month.abb워드 프로세서가 일치하는 로케일 특정라고 때문에 %의 B에 일치하는 데 사용됩니다.)
IRTFM

6
@CarlWitthoft 우리 중 일부는 가끔씩 넘어집니다. 내가 멈춰있는 동안 차 주셔서 감사합니다. 이 질문에서 나는 몇 가지 올바른 것을 얻었습니다. 나는 sessionInfo ()를 포함하고, 내가 검색 한 것을 말하고, 링크를 포함 시켰으며, 가능한 한 간결하게 유지했습니다. 나는? as.Date에서 한 줄을 놓 쳤고 당신은 나에게 TFM 치료를 제공합니다. 우리 모두가 항상 당신만큼 완벽 할 수는 없습니다.
Matt Dowle 2013

1
@MatthewDowle 열심히 내려 오면 죄송합니다. 나는 당신이 "합리적으로 잘 교육받은 인간에게는 모호하지 않음"과 "불쌍한 무력한 코드 조각에 대해 모호하지 않음"을 혼동하는 것처럼 보였을 때 화려 함이 시작되었다고 생각합니다. :-(
Carl Witthoft 2013

답변:


66

이것은 문서화 된 동작입니다. 에서 ?as.Date:

형식 : 문자열. 지정하지 않으면 첫 번째 비 'NA'요소에서 ' "% Y- % m- % d"'를 시도한 다음 ' "% Y / % m / % d"'를 시도하고 둘 다 작동하지 않으면 오류가 발생합니다.

as.Date("01 Jan 2000")형식이 위에 나열된 두 가지 중 하나가 아니므로 오류가 발생합니다. as.Date("01/01/2000")날짜가 위에 나열된 두 가지 형식 중 하나가 아니기 때문에 오답을 생성합니다.

"표준 명확성"을 "ISO-8601"을 의미하는 것으로 as.Date간주합니다 ( "% m / % d / % Y"는 ISO-8601이 아니므로 엄격 하지는 않지만 ).

이 오류가 발생하는 경우 해결 방법은에 설명 된 형식을 사용하여 날짜 (또는 날짜 / 시간) 형식을 지정하는 것입니다 ?strptime. 데이터에 날짜 / 월 이름 및 / 또는 약어가 포함 된 경우 특히주의해야합니다. 변환은 사용자의 로케일에 따라 달라지기 때문입니다 (의 예 참조 ?strptime및 읽기 ?LC_TIME).


6
@BenBolker 어때요 "character string is not either %Y-%m-%d or %Y/%m/%d"?
Matt Dowle 2013

9
동작은 확실히 ?as.Date(+1)에 문서화되어 있습니다. 그러나 "표준의 모호하지 않은 형식"이라는 오류 메시지는 아이러니하게도 모호하며, 이전의 23 개 질문이이를 증명합니다. "형식이 인식되지 않습니다. 문서를 참조하십시오"와 같은보다 직접적인 오류 메시지는 사용자 경험을 향상시킬 수 있습니다. 또한 "01/01/2000"이 ISO-8601 ( "2000-01-01"은 ISO-8601)이라고 생각하지 않아 모호함을 더합니다.
jthetzel

@jthetzel : 맞습니다. "01/01/2000"은 ISO-8601이 아닙니다. 저는 개인적으로 ISO-8601이 표준적이고 모호하지 않은 형식이라고 생각합니다. 그리고 as.Date"01/01/2000"에 대해 불평하지 않는 것이 오류 메시지와 일치하지 않는다는 데 동의 합니다.
Joshua Ulrich

31

즉, 형식을 지정하는 것보다 더 나은 솔루션이 있습니까?

예, (즉, 늦은 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()그들을 통해 . 형식없이.


2
불완전한 형식으로 날짜를 구문 분석하려는 또 다른 질문이 있었기 때문에 여기에 왔습니다 . 완전한 것을 위해 우리는 이제 무언가를 가지고 있습니다. 나는 이것에 매우 만족합니다. 그것은 잔소리하는 질문이었습니다. 그리고 말할 필요도없이, anytime()똑같이 유용하다 POSIXct.
Dirk Eddelbuettel

그냥 anytime 패키지를 사용했고 꽤 많은 NA를 제외하고는 훌륭하게 작동했습니다. 날짜 벡터에서 trimws ()를 실행 한 후 모든 것이 완벽했습니다.
변호사

나는 미터 톤도 사용한다!
더크 Eddelbuettel

너무 간단 해! mm-dd (yy 없음)의 문자열 값이있는 열에 anydate ()를 사용했습니다. 열의 모든 <chr> 값이 <date>로 성공적으로 변환되었습니다. 불행히도 올해는 '2020'이 아닌 '1400'으로 설정되었습니다. ¯_ (ツ) _ / ¯
owlstone

글쎄요. 이 사이트의 다른 몇 가지 질문에서 답변했듯이 mm-dd날짜가 아닙니다 (mm-yy 또는 mm-yyyy도 아님). 거기에없는 것을 파싱 할 수 없습니다.
Dirk Eddelbuettel

26

@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모호하지 않고 모호하지 않은 것으로 간주됩니다.


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.

2

이것은 이전에 날짜가 어떻게 코딩되었는지 상관없이 완벽하게 작동합니다.

library(lubridate)
data$created_date1 <- mdy_hm(data$created_at)
data$created_date1 <- as.Date(data$created_date1)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.