使用R获得一年中所有日子的矢量

问题描述:

是否有一个简单的R习惯用于获得给定年份中的日期向量?我可以做这做OK ...除了闰年如下:使用R获得一年中所有日子的矢量

dtt <- as.Date(paste(as.character(year), "-1-1", sep="")) + seq(0,364) 

我,很明显,加线(年+ 1)过滤掉任何值,但我猜有一个多更短的方式来做到这一点。

这个怎么样:

R> length(seq(as.Date("2004-01-01"), as.Date("2004-12-31"), by="+1 day")) 
[1] 366 
R> length(seq(as.Date("2005-01-01"), as.Date("2005-12-31"), by="+1 day")) 
[1] 365 
R> 

它使用尼坦,但基础R正确计算上的日期给你的载体。如果你想要更高级的操作员,看看例如在lubridate甚至我更简陋的RcppBDT它包装部分Boost Time_Date库。

+0

只需在第二个'as.Date'后添加'-1'。 – James

+0

不错,没有想到这一点。这将确实解决它。想想看,我可以只使用20xx-12-31。 –

利用德克的指导下,我看中了这个:

getDays <- function(year){ 
    seq(as.Date(paste(year, "-01-01", sep="")), as.Date(paste(year, "-12-31", sep="")), by="+1 day") 
} 
+1

我是一个坦荡的家伙;) –

我很想知道这是否会更快反转测序和铸造as.Date

# My function getDays 
getDays_1 <- function(year) { 
    d1 <- as.Date(paste(year, '-01-01', sep = '')); 
    d2 <- as.Date(paste(year, '-12-31', sep = '')); 
    as.Date(d1:d2, origin = '1970-01-01'); 
}; 

# other getDays 
getDays_2 <- function(year) {  
    seq(as.Date(paste(year, '-01-01', sep='')), 
     as.Date(paste(year, '-12-31', sep='')), 
     by = '+1 day'); 
}; 

test_getDays_1 <- function(n = 10000) { 
    for(i in 1:n) { 
    getDays_1(2000); 
    }; 
}; 

test_getDays_2 <- function(n = 10000) { 
    for(i in 1:n) { 
    getDays_2(2000); 
    }; 
}; 

system.time(test_getDays_1()); 
# user system elapsed 
# 4.80 0.00 4.81 

system.time(test_getDays_2()); 
# user system elapsed 
# 4.52 0.00 4.53 

我可能不会 。 。 。看来测序Date对象比将整数向量转换为Date s

要快一些,但是对于一系列日期,我想知道当年的天数。我想出了以下函数,它返回一个与输入中的日期长度相同的向量。

days_in_year <- function(dates) { 
    years <- year(dates) 
    days <- table(year(seq(as.Date(paste0(min(years), '-01-01')), 
          as.Date(paste0(max(years), '-12-31')), 
          by = '+1 day'))) 
    as.vector(days[as.character(years)]) 
} 

它的工作原理类似德克的解决方案,但是它使用lubridate::year函数来获取所有日期的年份部分的两倍。使用表格和长度一样,但是对于所有独特的年份。如果日期不是连续的年份,它可能会使用更多的内存而不是绝对必要的内存。