2012-02-27 21 views
5

tengo dos fechasdías Contar por año

begin <- as.Date("2007-05-20") 
end <- as.Date("2010-06-13") 

¿Cómo puedo contar los días del año?

La salida tal vez debería tener este aspecto

year days 
2007 226 
2008 366 
2009 365 
2010 164 

Respuesta

11

primero vamos a crear una determinada secuencia adecuada:

R> bd <- as.Date("2007-05-20") 
R> ed <- as.Date("2010-06-13") 
R> seqd <- seq(bd, ed, by="1 day") 
R> head(seqd) 
[1] "2007-05-20" "2007-05-21" "2007-05-22" "2007-05-23" "2007-05-24" "2007-05-25" 

A continuación, crear una función auxiliar que, dada una fecha, devuelve su año:

R> getYear <- function(d) as.POSIXlt(d)$year + 1900 
R> getYear(head(seqd)) 
[1] 2007 2007 2007 2007 2007 2007 

Después de eso, simplemente llame table() en qué devuelve el ayudante de la secuencia de fecha:

R> table(getYear(seqd)) 

2007 2008 2009 2010 
226 366 365 164 
+3

Una ligera variación de lo anterior sería: 'tabla (formato (seq (bd, ed," día "),"% Y "))' –

+0

Nice one Gabor. No podía recordar que fuera el extractor más sucinto; tu versión seguramente califica. –

1

Algo como esto debe hacer el truco:

function daysPerYear(begin, end) 
{ 
    var days = {}; 
    for (var y = begin.getFullYear(); y < end.getFullYear(); y++) 
    { 
     days[y] = Math.ceil((new Date(y+1, 0, 1) - begin)/86400000); 
     begin = new Date(y+1, 0, 1); 
    } 
    days[ end.getFullYear() ] = Math.ceil((end - begin)/86400000); 
    return days; 
} 

muestra:

console.log(daysPerYear(new Date("2007-05-20"), new Date("2010-06-13"))); 

http://puu.sh/iBgo

Editar: Pensé que se trataba de Javascript.

+0

sí, me preguntaba :) ¡pero de todos modos una buena codificación! – speendo

2

O, como alternativa, cree un data.frame con una columna adicional year (utilizando datos de Dirk):

dat = data.frame(seqd, year = strftime(seqd, "%Y")) 
> head(dat) 
     seqd year 
1 2007-05-20 2007 
2 2007-05-21 2007 
3 2007-05-22 2007 
4 2007-05-23 2007 
5 2007-05-24 2007 
6 2007-05-25 2007 

y luego usar count del paquete plyr:

require(plyr) 
> count(dat, "year") 
    year freq 
1 2007 226 
2 2008 366 
3 2009 365 
4 2010 164 
1

Una solución intensivo menos memoria sería, aunque no un un trazador de líneas:)

begin <- as.POSIXlt("2007-05-20", tz = "GMT") 
end <- as.POSIXlt("2010-06-13", tz = "GMT") 

year <- seq(begin$year, end$year) + 1900 
year.begin <- as.POSIXlt(paste(year, "01", "01", sep="-"), tz="GMT") 
year.begin[1] <- begin 
year.end <- as.POSIXlt(paste(year, "12", "31", sep="-"), tz="GMT") 
year.end[length(year.end)] <- end 
days <- as.numeric(year.end - year.begin) + 1 
cbind(year, days) 

Motivado por Make this process more processor intensive and less memory intensive

Cuestiones relacionadas