R在一个循环中将日期转换为儒略日

时间:2016-11-17 15:17:27

标签: r date julian julian-date

我有一些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)

每年,我想将日期转换为朱利安日,即一年中的某一天。我在这个链接中使用了以下功能:

Convert date without year into Julian day (number of days since start of the year)

对于闰年(例如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"))。有谁知道如何解决它?

1 个答案:

答案 0 :(得分:1)

为什么不简单地使用自年初以来包含Julian天的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