R конвертирует даты в юлианские дни в цикле

У меня есть дата с 1996 по 2014 год, которую мне нужно преобразовать в юлианские дни. Вот пример данных:

date<- c("21-Jul", "14-Jul", "08-Jul", "08-Jul","16-Jul","22-Jul", "10-Jul", "02-Jul", "06-Jul","18-Jul","24-Jul", "15-Jul", "03-Jul", "04-Jul","19-Jul") 
year<-rep(1996:1998,each=5)
dat<-as.data.frame(cbind(date,year))
dat$date<-as.character(dat$date)

Для каждого года я хочу преобразовать дату в юлианский день, то есть день года. Я использовал следующую функцию из этой ссылки:

Конвертировать дату без года в юлианский день (количество дней с начала года)

Для високосного года (например, 1996 г.) я могу преобразовать дату в юлианский день следующим образом:

julian(as.Date(paste0("1996-", ds$DS), format="%Y-%d-%b"), origin=as.Date("1996-01-01"))+1

Для невисокосного года (например, 1997) я могу преобразовать дату в юлианский день следующим образом:

julian(as.Date(paste0("1997-", ds$DS), format="%Y-%d-%b"), origin=as.Date("1997-01-01"))

Теперь я хочу сделать это в цикле для периода с 1996 по 2014 год. Я сделал это:

install.packages("lubridate") # function for detecting leap year
library("lubridate")
years <- 1996:2014
leap<-years[leap_year(years)]

for(i in 1996:2014){
 if(i %in% leap){
    julian(as.Date(paste0(i,"-", ds$DS), format="%Y-%d-%b"), origin=as.Date(i,"-01-01"))+1
} else {
   julian(as.Date(paste0(i,"-", ds$DS), format="%Y-%d-%b"), origin=as.Date(i,"-01-01"))
}}

Error in charToDate(x) : 
character string is not in a standard unambiguous format

Думаю, ошибка возникает из-за paste0(i,"-", ds$DS) и этого origin=as.Date(i,"-01-01")). Кто-нибудь знает, как с этим справиться?


person user53020    schedule 17.11.2016    source источник
comment
Наверное origin=as.Date(paste0(i, "-01-01"))?   -  person ytk    schedule 17.11.2016
comment
Да, это работает. Спасибо   -  person user53020    schedule 17.11.2016
comment


Ответы (1)


Почему бы вам просто не использовать класс POSIXlt, который содержит юлианские дни с начала года в качестве одного из его компонентов?

as.POSIXlt(as.Date(paste(dat$year, dat$date, sep = "-"),
        "%Y-%d-%b"))$yday
#[1] 202 195 189 189 197 202 190 182 186 198 204 195 183 184 199
person Roland    schedule 17.11.2016
comment
Да, я тоже могу его использовать, но мне все еще нужно отделить високосные годы от високосных и добавить +1 в конце команды для високосного года? - person user53020; 17.11.2016
comment
У вас есть для каждой даты год в вашем примере data.frame. Этот ответ автоматически обрабатывает високосные годы. И если вам нужно добавить 1, я не могу вам сказать. В документации сказано: yday: 0–365: day of the year Решайте сами, предпочитаете ли вы 1-366. - person Roland; 17.11.2016