Crear una variedad de datos de inicio/fin de día en R
-
28-10-2019 - |
Pregunta
Estoy usando R para hacer un análisis de series de tiempo usando Zoo y Chron. Tengo un objeto de zoológico con muchos datos y necesito poder usar el window
Funcionar para subcontar los datos a solo un día de un día, luego los próximos días, luego el siguiente, etc.
He tratado de encontrar la forma más fácil de crear una matriz con la fecha de cada día en un cierto período y he encontrado lo siguiente:
orig = c(month=1, day=1, year=2005)
dates <- chron(1:1825, origin=orig, out.format=c(dates="d/m/y", times="h:m"))
Esto usa la notación del Día Julian y tiene 1825 días (365*5, así que cinco años), comenzando con el primer día de mi período de fecha. Luego trato de hacer un bucle for usando cada uno de los elementos de esta matriz:
for (date in dates)
{
s = chron(date, "00:00:00", origin=orig)
e = chron(date, "23:59:59", origin=orig)
aeronet_day = window(aeronet, start=s, end=e)
}
Sin embargo, esto me da una advertencia que dice que estoy usando diferentes orígenes para el aeronet
objeto de zoológico y el s
y e
variables, y no selecciona ningún dato.
¿Hay una mejor manera de hacer esto? ¿O una forma de solucionar esto? Básicamente, lo que quiero es ejecutar un bucle for donde en el bucle puedo usar el aeronet_day = window(aeronet, start=s, end=e)
Código para producir un objeto Zoo que contenga los datos durante un día (por ejemplo, el 1 de mayo de 2005 de 00:00:00 a 23:59:59.
Solución
Supongamos que tenemos estos datos:
# create test data
library(zoo)
library(chron)
z <- zooreg(1:30, start = chron("2000-01-01"), freq = 2)
1) agregadoEl r aggregate
La función tiene un método de zoológico. El segundo argumento es por lo que nos agregamos. Si es una función, se aplica al índice del objeto Zoo. Por ejemplo, aquí calculamos la media para cada fecha:
z.ag <- aggregate(z, as.Date, mean)
Podemos reemplazar mean
con una función más compleja si lo deseamos.
2) Split. El r split
La función tiene un método de zoológico. Si realmente queremos separarnos z
Por fecha, entonces podemos hacer esto. Aquí z.split.list
es una lista, cada uno de cuyos componentes contiene el objeto Zoo para una fecha.
z.split.list <- split(z, as.Date(time(z)))
Ahora (a) sapply
o (b) lapply
sobre esa lista o (c) use lo siguiente (reemplazar print(zc)
con cualquier procesamiento que se desee). Aquí zc
es un componente de la lista, es decir, es el objeto del zoológico formado simplemente tomando una fecha en particular:
for(zc in z.split.list) print(zc)
Tenga en cuenta que as.Date(time(z))
es un vector con las fechas correspondientes a los elementos de z.
EDITAR:
Varias elaboraciones menores.
Otros consejos
No estoy familiarizado con el zoológico, pero generalmente solo convierto la fecha en un numérico, luego hago la secuencia y luego vuelvo de nuevo. Por ejemplo:
> as.Date(Sys.Date():(Sys.Date()+365), origin='1970-01-01')
[1] "2011-12-06" "2011-12-07" "2011-12-08" "2011-12-09" "2011-12-10" "2011-12-11" "2011-12-12" "2011-12-13"
[9] "2011-12-14" "2011-12-15" "2011-12-16" "2011-12-17" "2011-12-18" "2011-12-19" "2011-12-20" "2011-12-21"
[17] "2011-12-22" "2011-12-23" "2011-12-24" "2011-12-25" "2011-12-26" "2011-12-27" "2011-12-28" "2011-12-29"
[25] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06"
[33] "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" "2012-01-11" "2012-01-12" "2012-01-13" "2012-01-14"
[41] "2012-01-15" "2012-01-16" "2012-01-17" "2012-01-18" "2012-01-19" "2012-01-20" "2012-01-21" "2012-01-22"
...
Si desea hacer algo por fecha, lo que tiene está bien.
Alguna muestra aeronet
datos.
last_date <- 1825
n <- 10000
aeronet <- data.frame(
some.value = seq_len(n),
date = as.chron(
runif(n, 0, last_date),
origin = orig,
out.format = c(dates = "d/m/y", times = "h:m")
)
)
Ahora puede dividir los datos por fecha utilizando split
, o aplique una función a cada fecha con tapply
o ddply
de plyr
(o usar aggregate
o lo que sea).
with(aeronet, split(some.value, date))
with(aeronet, tapply(some.value, date, sum))
library(plyr)
ddply(aeronet, .(date), summarise, sum(some.value))