10

是否有一个简单的 R 习语来获取给定年份中的天数?我可以执行以下操作...除了闰年:

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

显然,我可以添加一行来过滤掉 (year + 1) 中的任何值,但我猜有一种更短的方法可以做到这一点。

4

4 回答 4

21

那这个呢:

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> 

这使用 nuttin' 但基于 R 来正确计算日期,从而为您提供向量。如果您想要更高级别的运算符,请查看lubridate甚至我的更基本的RcppBDT,它包含了 Boost Time_Date 库的部分内容。

于 2011-08-24T14:15:07.733 回答
7

使用 Dirk 的指导,我已经解决了这个问题:

getDays <- function(year){
     seq(as.Date(paste(year, "-01-01", sep="")), as.Date(paste(year, "-12-31", sep="")), by="+1 day")
}
于 2011-08-24T14:40:22.977 回答
0

我很想知道颠倒排序和铸造是否会更快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对象比将整数向量转换为Dates稍快

于 2011-08-24T16:00:58.463 回答
0

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

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)])
}

它的工作方式类似于 Dirk 的解决方案,但它使用该lubridate::year函数两次获取所有日期的年份部分。使用 table 与 length 相同,但是对于所有独特的年份。如果日期不是连续年份,它可能会使用比严格必要更多的内存。

于 2016-11-10T13:22:47.137 回答