/ / Cómo agregar cada 30 minutos en R - r, gráfico, series de tiempo, agregado

Cómo agregar cada 30 minutos en R - r, gráfico, serie temporal, agregado

Estoy atascado en R. Necesito agregar datos de cada minuto en cada 30 minutos. Mi marco de datos es así:

    Date        Time       Power
2008-10-11  23:57:00   0.376
2008-10-11  23:58:00   0.374
2008-10-11  23:59:00   0.374
2008-10-12  0:00:00    0.334
2008-10-12  0:01:00    0.330
...
2008-12-13  19:24:00   1.390
2008-12-13  19:25:00   1.370
2008-12-13  19:26:00   1.368
2008-12-13  19:27:00   1.362
2008-12-13  19:28:00   1.352
2008-12-13  19:29:00   1.360

...

Básicamente, tengo 500,979 filas de datos para 2008. Cada minuto da un valor de potencia. Para hacer series temporales, necesito agregar mis datos por 30 minutos. Eso me daría alrededor de 17.520 filas al final. Mis preguntas son:

  1. ¿Es posible trazar series de tiempo cuando faltan algunos valores para la columna Potencia?

  2. ¿Cómo agregar el valor de potencia en 30 minutos, por favor? (por ejemplo, 0:00:00 a 0:29:00; 0:30:00 a 0:59:00)

¡Muchas gracias!

Respuestas

1 para la respuesta № 1

Con magrittr y dplyr, puede generar una nueva columna para contener una variable de agrupación con la unidad de tiempo en la que se encuentra la medición, luego summarise para calcular cualquier métrica agregada que desee. (Nota %<>% guarda los resultados de las tuberías nuevamente en la variable original).

No estoy seguro de en qué formato está tu horaya, cuando lo leí, es solo un carácter, por lo que convertirlo en horas numéricas requiere un poco de trabajo. Si ya está en algún otro formato para usted, ese paso probablemente sería más fácil.

df %<>%
mutate(cleanTime =
strsplit(Time, ":") %>%
sapply(function(x){
x <- as.numeric(x)
x[1] + x[2]/60 + x[3]/(60*60)
})
, roundTime = floor(cleanTime * 2)/2
)

Luego, agrupe por la variable generada y tome las estadísticas agregadas que desee:

df %>%
group_by(Date, roundTime) %>%
summarise(avgPower = mean(Power)
, sumPower = sum(Power))

da:

        Date roundTime  avgPower sumPower
<date>     <dbl>     <dbl>    <dbl>
1 2008-10-11      23.5 0.3746667    1.124
2 2008-10-12       0.0 0.3320000    0.664
3 2008-12-13      19.0 1.3670000    8.202

1 para la respuesta № 2

Con dplyr puedes hacer lo siguiente (puedes cambiar mean a su función de agregación):

df %>%
mutate(DateTime = as.POSIXct(paste(Date, Time))) %>%
group_by(DateTime = cut(DateTime, breaks="30 min")) %>%
summarize(Power = mean(Power))

Resultará en la próxima salida:

             DateTime  Power
<fctr>  <dbl>
1 2008-10-11 23:57:00 0.3576
2 2008-12-13 18:57:00 1.3760
3 2008-12-13 19:27:00 1.3580