2016-12-19 11 views
0

펜타 드 날짜별로 다음 데이터를 부분 집합하려고합니다. Pentad는 5 일간 중복되지 않는 평균값을 의미합니다. 윤년의 경우, 펜타 12 월 29 포함 (6 일 대신 5의 평균) :윤년이있는 펜타드 날짜를 기반으로 한 서브 세트 데이터

library(stringr) 
dat  <- read.csv("tc_filt_1981-2007.csv",header = T,sep = ",") 

dat$Date = paste(dat$Year, str_pad(dat$Month,2,'left','0'), str_pad(dat$Day,2,'left','0'), sep='-') 
dat$yday = as.POSIXlt(dat$Date)$yday + 1 
dat$pentad = ceiling(dat$yday/5) 
df<-split(dat, dat$pentad) 

문제 :

여기에 Link to pentad dates

Link to Data

내 코드입니다 dat $ y 행은 365 일 동안 만 작동합니다. 주어진 해에는 73 개의 펜타 드 만 있어야합니다. 위의 코드는 dat $ pentad을 확인할 때 74 펜타드를 생성합니다. df는 각 pentad에 대한 데이터 프레임을 포함합니다.

내가했던 검사에 다음

test<-dat[which(dat$pentad == 74),] 

출력 :

SN  CY Year Month Day Hour Lat Lon Cat Date yday pentad 
200034 34 2000 12 31 0 12.7 128.2 TS 2000-12-31 366  74 
200034 34 2000 12 31 6 13.3 128.8 TS 2000-12-31 366  74 
200034 34 2000 12 31 12 13.9 129.7 TS 2000-12-31 366  74 
200034 34 2000 12 31 18 14.4 130.6 TS 2000-12-31 366  74 

질문 : 내 코드에서 윤년을 고려 어떻게

  1. ?

누구에게 어떻게하면 좋을까요?

많은 감사,

+0

_pentad_의 정의는 윤년에 대해 무엇을 말하는가? 2 월 29 일이 내려갈 예정입니까? 또는 2 월 29 일부터 3 월 1 일까지를 다루는 Pentad 12는 5 대신 6 일로 구성됩니까? – Uwe

+0

@UweBlock. 당신이 올바른지. 윤년의 경우, Pentad 12는 보통 5 일 대신 6 일을 사용합니다. Pentad는 겹치지 않는 평균을 의미합니다. – ichabod

+0

이제 윤년의 펜타드 정의가 명확 해 졌으므로 1 년 동안 펜타드 시작일 목록을 얻고, 데이터의 전체 기간을 다루는 두 번째 목록을 만들고 'cut ()'을 선택하십시오. – Uwe

답변

1

마이너 조정 :

library(lubridate) 
dat$pentad = ceiling((dat$yday - leap_year(dat$Year)*(dat$yday > 59))/5) 
+1

코드는 일반적인 연도 인 1900 년 동안 실패합니다. 나는 lubridate :: leap_year()를 사용하도록 제안한다. – Uwe

+0

@UweBlock. 귀하의 제안에 감사드립니다. 나는 그것을 시도 할 것이다. – ichabod