Получить вектор всех дней в году с R - PullRequest
10 голосов
/ 24 августа 2011

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

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

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

Ответы [ 4 ]

20 голосов
/ 24 августа 2011

А как насчет этого:

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.

7 голосов
/ 24 августа 2011

Используя руководство Дирка, я остановился на этом:

getDays <- function(year){
     seq(as.Date(paste(year, "-01-01", sep="")), as.Date(paste(year, "-12-31", sep="")), by="+1 day")
}
0 голосов
/ 10 ноября 2016

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

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

0 голосов
/ 24 августа 2011

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

...