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
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
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
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")));
Editar: Pensé que se trataba de Javascript.
sí, me preguntaba :) ¡pero de todos modos una buena codificación! – speendo
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
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
Una ligera variación de lo anterior sería: 'tabla (formato (seq (bd, ed," día "),"% Y "))' –
Nice one Gabor. No podía recordar que fuera el extractor más sucinto; tu versión seguramente califica. –