2016-10-17 3 views
1

ymd()와 year()를 사용하여 연도별로 서브 로트를 얻는 중입니다. 그 불균형을 일으키는 원인이 무엇인지 알아 내려고합니다. .yumd()와 year()를 사용하여 다른 결과를 얻을 수 있습니다.

331kb 10K 날짜가있는 CSV 파일은 here입니다. Google 드라이브 및 Dropbox를 가리키는 URL이 내 초보자 기술을 뛰어 넘는 오류를 계속 발생 시켰습니다.

require(data.table) 
require(lubridate) 

teaSet <- fread("../teaSet.csv", na.strings=c("NA","N/A", "")) 
teaSet$opened <- ymd_hms(teaSet$opened, tz = "") 
teaSet$year <- as.factor(teaSet$year) 

ymd2010 <- teaSet[opened >= ymd("2010-01-01") & opened <= ymd("2010-12-31"),] 
#1480 obs. 
year2010 <- teaSet[year(opened)==2010,] 
#1483 obs 

summary(teaSet$year) 
#2010 2011 2012 2013 2014 2015 2016 
#1483 1408 1317 1414 1521 1701 1156 

내가 누락 된 내용을 누구든지 설명 할 수 있습니까? 나는 날짜 범위별로 부분 집합을하고 년()과 연도()와 ymd() 개수가 다른 것으로 나타났습니다. 일을 가속화하기 위해 수년간 요소 컬럼을 만들었습니다. (그리고 "똑똑하게"연도 "라고 부름) - 데이터 세트에 1,300 만 행이 있습니다.하지만 제 질문에는 직접 관련이 없습니다. 시작했을 때 좋은 생각 인 것 같았습니다. 나는 다른 표본 크기를 만들었고 불균형은 크기에 따라 변하지 않았습니다. 감사!

+0

예, 이미 시간대 설정을 시도했지만 아무런 차이가 없습니다. 나는 3 가지 다른 시간을 추상화했는데 그 중 첫 번째는 다른 일이 있음을 암시합니다. '# 1 : 2010-12-31 09:09:00 # 2 : 2010-12-31 20:49:58 # 3 : 2010-12-31 23 : 38 : 18' – armipunk

+0

문제를 좀 더 살펴보면 다음과 같이 보입니다. ymd ("2010-12-31")는 12 시가 아니라 31시에 오전 12시입니다. 열린 <= ymd ("2011-1-1")를 변경하면 제대로 작동합니다. 그 문제를 피하려면 GMT로 설정하는 것이 좋습니다. - 행운을 빕니다 – Dave2e

+0

고마워요! 범위를 열린 <= ymd ("2011-1-1")로 변경 했으므로 이제 개수가 정확합니다. 나 또한 열었습니다 <= ymd_hms ("2010-12-31 23:59:59") 및 hms 지정 너무 일했습니다. 그것은 매우 직관적이지 않습니다. 왜 hms를 지정하지 않으면 날짜의 ymd 부분이 변경되어야합니다. 내 로캘은 America/New_York이므로 UTC와의 차이는 위의 두 번째 주석에서 이종 날짜 중 첫 번째 날짜와 차이를 만들어서는 안됩니다. 답변으로 마지막 코멘트를 써 주시면 받아 들일 수 있습니까? – armipunk

답변

0

ymd ("2010-12-31")는 12 시가 아니라 31시에 오전 12시입니다.
가능한 해결책을 볼 수있는 2 가지 옵션이 있습니다. 다음 날 필터를 사용하거나 모든 날짜/시간을 GMT가있는 날짜로 변환하십시오.

개봉을 변경하면 < = ymd ("2011-1-1")가 열리게됩니다.

require(lubridate) 
library(data.table) 

teaSet <- fread("teaSet.csv", na.strings=c("NA","N/A", "")) 
teaSet$opened <- ymd_hms(teaSet$opened, tz = "") 
teaSet$year <- as.factor(teaSet$year) 

ymd2010 <- teaSet[opened >= ymd("2010-01-01") & opened < ymd("2011-1-1"),] 
print(dim(ymd2010)) 

#a second possible option - not as clean as the prior one 
teaSet$opened <- ymd_hms(teaSet$opened, tz = "GMT") 
ymd2010_2 <-teaSet[as.Date(opened) >= ymd("2010-01-01") & as.Date(opened) <= ymd("2010-12-31")] 
print(dim(ymd2010_2)) 

year2010 <- teaSet[year(opened)==2010,] 

print(dim(year2010)) 
summary(teaSet$year) 

나는 시간대 문제가 직관적이지 않지만 그것이 무엇인지 동의합니다. 원래 솔루션의 불일치를 테스트하고 잡기에 좋은 직장입니다.

+0

그리고 왜 이런 식으로 행동하는지 이유를 알아 내거나 실행하면 - pl 게시하십시오. 나는 이런 종류의 비합리적인 것의 바닥에 도달하려고 많은 시간을 낭비한다. 또한 두 번째 제안을 사용하여 tz를 "GMT"로 설정하는 것을 망설이고 나중에 혼란을 야기 할 가능성이 있기 때문에 UTC가 아니라면 timestamp를 사용하면 UTC를 현지 표준 시간대로 즉시 변환 할 수 있습니다. 도움말 페이지에서 "결과 POSIXct 객체에 대한 시간대 - 이것이 GMT가 아닌 x 시간입니다!"라고 말하면서 저는 fasttime을 사용하기를 포기했습니다. - 나 혼란스러워. – armipunk

관련 문제