2016-12-19 2 views
0

Я пытаюсь подобрать следующие данные по датам пентада. Pentad означает не перекрывающийся 5-дневный средний. Для високосных лет ПЕНТАДА 12 включает в себя 29 февраля (6 дней в среднем вместо 5):Данные подмножества на основе дат пентада с високосным годом

Link to Data

Link to pentad dates

Вот мой код:

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) 

Проблема:

dat $ y линия работает только на 365 дней. В конкретном году должно быть только 73 пентада. Мой код выше дает 74 pentads, когда я проверяю dat $ pentad. Df содержит кадры данных для каждого пентада.

я сделал следующее для проверки:

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_ сказать о високосных годах? Выйдет ли 29 февраля? Или Pentad 12, который охватывает 29 февраля по 01 марта, состоит из 6 дней вместо 5? – Uwe

+0

@UweBlock. Ты прав. Для високосных лет Pentad 12 имеет 6 дней вместо обычных 5 дней. Пентад означает непересекающееся среднее. – ichabod

+0

Теперь, когда определение пятен в високосный год было выяснено, вы можете попытаться получить список дат начала пентада в течение одного года, создать второй список, который охватывает полный временной интервал ваших данных, и использовать 'cut () 'на ваши данные. – Uwe

ответ

1

Minor регулировки:

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

Пожалуйста, обратите внимание, что код не будет работать в течение 1900 года, который является общим годом. Я предлагаю использовать 'lubridate :: leap_year()'. – Uwe

+0

@UweBlock. Спасибо за ваше предложение. Я попробую это. – ichabod