2011-08-24 9 views
10

¿Hay un simple modismo R para obtener un vector de los días de un año determinado? Puedo hacer lo siguiente, que hace bien ... a excepción de los años bisiestos:Obtenga un vector de todos los días en un año con R

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

Podría, por supuesto, añadir una línea a filtrar los valores de (año + 1), pero supongo que hay una gran parte forma más corta de hacer esto.

Respuesta

18

Qué tal esto:

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> 

Esto utiliza eras mas base de R para calcular correctamente en las fechas para darle su vector. Si quieres operadores de nivel superior, mira, por ejemplo, en lubridate o incluso mi RcppBDT más rudimentario que envuelve partes de la biblioteca Boost Time_Date.

+0

Simplemente agregue un '-1' después del segundo' as.Date'. – James

+0

Bueno, no había pensado en eso. Eso lo arreglará. Ahora que lo pienso, podría haber usado 20xx-12-31 de todos modos. –

7

el uso de guía de Dirk me he decidido por este:

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

Soy un tipo un poco magnánimo;) –

0

Me interesaría saber si sería más rápido para invertir la secuenciación y el casting 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 

I adivina no. . . parece que la secuenciación Date objetos es ligeramente más rápido que convertir un vector de enteros a Date s

0

que necesitaba algo similar, sin embargo, para un intervalo de fechas que quiero saber el número de días en ese año. Se me ocurrió la siguiente función, que devuelve un vector con la misma longitud que las fechas en la entrada.

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

Funciona de manera similar a la solución de Dirk, sin embargo, utiliza la función lubridate::year para obtener la parte del año de todas las fechas de dos veces. Usar la tabla hace lo mismo que la longitud, sin embargo, para todos los años únicos. Podría usar más memoria de la estrictamente necesaria si las fechas no son en años consecutivos.

Cuestiones relacionadas