2014-05-14 1 views
1

일부 시계열 조작을 수행하는 소프트웨어로 작업 중입니다. 나는 최근에 내가 개발 한 R 스크립트 측면에서 심각한 문제를 발견했다. 예기치 않은 동작이 로케일이 Europe/Moscow 인 특정 시스템에서 분리되었습니다. 이 문제는 다음 코드로 요약된다 : 보인다 유럽/모스크바 strptime 시간대 문제

strange_days <- c("2/1/1984", "3/1/1984", "4/1/1984", "5/1/1984", "6/1/1984") 
Sys.setenv(TZ='Europe/Moscow') 
d <- strptime(strange_days, '%m/%d/%Y') 
d 
[1] "1984-02-01 MSK" "1984-03-01 MSK" "1984-04-01"  "1984-05-01 MSD" "1984-06-01 MSD" 

모든 것이 올바르게 인식 할 수 있습니다. 나는 이것이 일별 데이터이기 때문에 시간대 속성이별로 차이가 없다고 생각했다. 고통스러운 실수 : 분명히 xts 객체로 변환시 이후에 실패

as.numeric(d) 
[1] 444430800 446936400  NA 452203200 454881600 

.

현재 수정 프로그램은 모든 시간대를 GMT (strptime(strange_days, '%m/%d/%Y', tz='GMT') 또는 Sys.setenv(TZ='GMT'))로 강제 설정합니다. 그 문제는 사라졌다.

좋은 방법입니까? 모든 상황에서 코드가 신뢰할 수 있습니까? 유사한 문제를 피하기 위해 어떤 기술을 권하고 싶습니까?

그리고 1984 년 4 월 1 일에는 어떤 특별한 일이 일어 났습니까?

편집 : thisthis 질문이 표시되어 아마 문제를 일으키는 일광 절약이다.

sessionInfo() 
R version 3.1.0 (2014-04-10) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252 LC_MONETARY=English_United Kingdom.1252 
[4] LC_NUMERIC=C       LC_TIME=English_United Kingdom.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.1.0 

편집 2 : 당신은 시간 만에 관심이 아니에요 이후,이 경우

R version 3.1.0 (2014-04-10) 
Platform: i686-pc-linux-gnu (32-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.1.0 
+0

[일광 절약 시간이 러시아에서 1984 년에 시작]되는 정확한 날짜는 (http://www.timeanddate.com/time/dst/1984.html)이 4 월 ... – plannapus

+0

의 1이다 'as.Date'를 사용하지 않는 이유는 무엇입니까? – plannapus

+0

또한 어떤 R/OS 버전을 사용하고 있습니까? Mac OS X 10.7.5와 R 2.14.2에서 저는 as.numeric (d)가 나타납니다. [1] 444430800 446936400 449611200 452203200 454881600' – plannapus

답변

1

: 문제는 분명히 Windows 관련,이 사양으로 리눅스에 복제되지 않습니다

> as.Date(strange_days,"%m/%d/%Y") 
[1] "1984-02-01" "1984-03-01" "1984-04-01" "1984-05-01" "1984-06-01" 

당신이 (당신이 이미 눈치) 가능성이 높습니다에 의한 일광 절약 팀에 직면하고 오류 : 날짜 당신은 as.Date을 사용할 수 있습니다 e : 1984 년 러시아의 DST가 4 월 1 일에 특별히 시작되었습니다 (source).

말했다되고 있다는 맥 OSX 10.7.5가 (예 약간 구식) R 2.14.2 실행에 오류가 재현되지 않습니다 :

> strange_days <- c("2/1/1984", "3/1/1984", "4/1/1984", "5/1/1984", "6/1/1984") 
> Sys.setenv(TZ='Europe/Moscow') 
> d <- strptime(strange_days, '%m/%d/%Y') 
> d 
[1] "1984-02-01 MSK" "1984-03-01 MSK" "1984-04-01 MSD" "1984-05-01 MSD" "1984-06-01 MSD" 
> as.numeric(d) 
[1] 444430800 446936400 449611200 452203200 454881600 

이 변경 사항 중 하나가 strptime로 만든 제안 R 버전 2.14.2와 3.1.0 사이에서이 동작이 수정되었습니다. 나는 현재 Changelogs에서 그것을 찾고 있지만 명확한 증거는 아직 없다. 또 다른 가능성은 플랫폼에 따라 다르다는 것입니다.

대부분의 시간대에 몇 번가 발생하지 않는 일부 때문에 여름 시간에서에/전환의 두 배 를 발생하는 기억 : 또한 여기

?strptime에서 발췌 한 것입니다. strptime은 (특정 시간대를 가정하지는 않음)과 같은 시간을 확인하지만, as.POSIXct에 의한 변환은 그렇게하지 않습니다.의 strftime 및 형식/인쇄에 의해 변환 OS 시설을 사용 할 수있다 (그리고 Windows에서 수행) DST 전환에 존재하지 않는 시간에 대한 터무니없는 결과를 반환 .

+0

(https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15768)? R 3.1.0 (2014-04-10)의 타임 스탬프를 고려하면 불가능하지 않습니다.이 버그는 2014-04-24에 패치로 수정되었습니다 ([R 3.1.0 패치의 변경 사항] 참조). /stat.ethz.ch/R-manual/R-devel/doc/html/NEWS.html)). 해당 패치 버전을 사용하면 문제가 계속 재현 될 수 있습니까? – plannapus

+0

여전히 패치 된 버전을 확인했습니다. 확인을 위해 – tonytonov

+0

주셔서 감사합니다. – plannapus