Получите вектор всех дней в году с R

Есть ли простой идиом R для получения вектора дней в данном году? Я могу сделать следующее, что хорошо... кроме високосных лет:

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

Я мог бы, очевидно, добавить строку, чтобы отфильтровать любые значения в (год + 1), но я предполагаю, что существует гораздо более короткий способ сделать это.

Ответ 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> 

Это использует nuttin ', но базу R, чтобы правильно вычислять даты, чтобы дать вам ваш вектор. Если вам нужны операторы более высокого уровня, посмотрите, например. на lubridate или даже на моем более рудиментарном RcppBDT, который обертывает части библиотеки Boost Time_Date.

Ответ 2

Используя руководство Dirk, я решил:

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

Ответ 3

Мне было бы интересно узнать, будет ли быстрее инвертировать последовательность и кастинг 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

Ответ 4

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

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, чтобы получить годную часть всех дат в два раза. Использование таблицы делает то же самое, что и длина, однако для всех уникальных лет. Он может использовать немного больше памяти, чем это необходимо, если даты не в последующие годы.