2013-05-16 2 views
2

값이 "2012-04-15 16:49:36 CEST"인 POSIXct 변수가 있습니다.형식입니다. POSIXct as as.POSIXct 변환 문제

  • 퍼센트의 Y : 포맷 기능이 예제이 덜 익숙한 2012 15 0 형식의 설명은, 올해의 주와 소수의 평일, 년 반환 년 세기로.
  • % W : 월요일을 첫 번째 요일로 사용하는 십진수 (00-53)의 주를 나타냅니다 (일반적으로 주 1의 첫 번째 월요일 인 의 첫 번째 월요일). 영국 대회.
  • % w : 10 진수로 표시되는 평일 (0-6, 일요일은 0).

그런 다음 값을 POSIXct 변수로 다시 변환하려고 시도하고 예기치 않은 상황이 발생합니다. 값을 읽을 때 함수가 잘못된 날짜를 해석하는 것 같습니다 (2012-04-08). 그러나 놀랍게도 Sys.time()을 사용하여 두 번째 예제에서 동일한 절차를 수행하면 예상대로 작동합니다. 누군가 첫 번째 예제에서 작동하지 않는 이유를 설명 할 수 있습니까?

(TS <- structure(1334501376, class = c("POSIXct", "POSIXt"))) 
(TS_YWw <- format(TS,format="%Y %W %w")) 
as.POSIXct(TS_YWw,format="%Y %W %w") 

(TS <- Sys.time()) 
(TS_YWw <- format(TS,format="%Y %W %w")) 
as.POSIXct(TS_YWw,format="%Y %W %w") 

그런데 출력

> (TS <- structure(1334501376, class = c("POSIXct", "POSIXt"))) 
[1] "2012-04-15 16:49:36 CEST" 
> (TS_YWw <- format(TS,format="%Y %W %w")) 
[1] "2012 15 0" 
> as.POSIXct(TS_YWw,format="%Y %W %w") 
[1] "2012-04-08 CEST" 
> 
> (TS <- Sys.time()) 
[1] "2013-05-16 15:27:44 CEST" 
> (TS_YWw <- format(TS,format="%Y %W %w")) 
[1] "2013 19 4" 
> as.POSIXct(TS_YWw,format="%Y %W %w") 
[1] "2013-05-16 CEST" 

, 나는 R 2.15.3와 윈도우 XP 32 비트 시스템에서 코드를 실행했습니다. 다들 감사 해요!

+0

이 문제를 더 잘 보여 '형식 (as.POSIXct를 ("2012-01-01 CEST") 포맷 = "%의 Y % W % 번 w"); POSIXct ("2012 1 0", format = "% Y % W % w")'. 2012-01-01 일요일이었다. 일요일에 시작된 2006 년에도 같은 문제가 있습니다. – Roland

+2

이 버그는 알려져 있습니다 : https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15195 – Roland

+0

이 버그는 최근에 수정되었습니다 : http://sourceware.org/bugzilla/show_bug.cgi?id = 15100 – Emer

답변

1

버그 같아요. 아래에서 2012 년에 일의 순서를 만들고 (dtimes) '% Y % W % w'형식을 사용하여 문자열로 변환하고 다시 변환합니다. 두 시리즈가 비교되고 head 출력은 변환에서 보존되지 않은 datetime을 표시합니다. 명백한 주간 패턴이 있습니다. as.POSIXct('2012 0 0', '%Y %W %w')NA을 반환합니다.

dtimes <- seq(as.POSIXct('2012-1-1'), as.POSIXct('2013-1-1'), by=as.difftime(1, units='days')) 

convert.YWw <- function(dtime) { 
    fmt <- "%Y %W %w" 
    string <- format(dtime, format=fmt) 
    as.POSIXct(string, format=fmt) 
} 
converted <- lapply(dtimes, convert.YWw) 
preserved <- dtimes == converted 
dtimes.and.converted <- mapply(function(d, c) c(dtime=d, convert=c), dtimes, converted, SIMPLIFY=FALSE) 
head(dtimes.and.converted[! preserved]) 

# [[1]] 
# NULL 
# 
# [[2]] 
#   dtime   convert 
# "2012-01-08 EST" "2012-01-01 EST" 
# 
# [[3]] 
#   dtime   convert 
# "2012-01-15 EST" "2012-01-08 EST" 
# 
# [[4]] 
#   dtime   convert 
# "2012-01-22 EST" "2012-01-15 EST" 
# 
# [[5]] 
#   dtime   convert 
# "2012-01-29 EST" "2012-01-22 EST" 
# 
# [[6]] 
#   dtime   convert 
# "2012-02-05 EST" "2012-01-29 EST"