在给定的一年中创建一个包含所有日期的向量

12

有没有一种简单的 R 习惯用语可以获取给定年份中所有日期的序列?我可以使用以下方法,它可以正常工作,但对于闰年来说不太好:

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

显然,我可以添加一行代码来过滤(year + 1)中的任何值,但我猜想有更简单的方法来实现这个目的。

4个回答

24

这个怎么样:

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 库的部分内容。


在第二个 as.Date 后面加上 -1 即可。 - James
不错,我没想过那个方法。那确实可以解决问题。现在想想,我本来就可以用 20xx-12-31 的。 - Dirk Eddelbuettel

10

在Dirk的指导下,我最终选择了这个:

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

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对象进行排序比将整数向量转换为Date对象要稍微快一些。


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相同,但适用于所有唯一的年份。如果日期不是连续的年份,它可能会使用比严格必要更多的内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接