Subconjunto de un marco de datos en R basado en fechas [cerrado]

8

Tengo un conjunto de datos con una estructura similar a un archivo de registro muy simple, quiero subconjugar los datos de acuerdo con los rangos de fechas, pero solo puedo hacerlo en un parámetro.

mis datos se ven así:

            date_time loc_id node  energy   kgco2 
1 2009-02-27 00:11:08     87  103 0.00000 0.00000 
2 2009-02-27 01:05:05     87  103 7.00000 3.75900 
3 2009-02-27 02:05:05     87  103 6.40039 3.43701 
4 2009-02-27 03:05:05     87  103 4.79883 2.57697 
5 2009-02-27 04:05:05     87  103 4.10156 2.20254 
6 2009-02-27 05:05:05     87  103 2.59961 1.39599

el archivo incluye datos para todo un año, quiero crear parcelas de resumen para cada mes y tal vez semana

Estoy procesando date_time de la siguiente manera:

> dt <-as.POSIXlt(ae$date_time)
> ae$dt <- dt
> names(ae$dt)
[1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"

ahora estoy tratando de subconjugar los datos como:

> x <- ae$energy[ae$dt$year=="110" & ae$dt$mon=="10"]
> x
numeric(0)

"110" se debe a lo siguiente:

> range(ae$dt$year)
[1] 109 110

También he intentado lo siguiente sin suerte:

> d <- subset(ae, (dt$year=="110" & dt$mon=="10"), select=energy)

estos sin embargo funcionan:

> d <- subset(ae, dt$year=="110", select=energy)

y esto también

> d <- subset(ae, dt$mon=="10", select=energy)

¿Alguna idea sobre cómo puedo subgrupo seleccionando año y mes?

Gracias,

G Garcia
fuente
2
Su código no funciona porque los componentes de un objeto POSIXlt son numéricos / enteros, no caracteres. Pero como dijo Shane, realmente deberías estar usando una clase de series de tiempo ...
Joshua Ulrich
Sí, si notas que ya publiqué la solución a continuación hace unos días.
G Garcia

Respuestas:

6

ok, las series de tiempo parecen haber hecho el truco:

aets <- as.xts(read.zoo("n8_energy_actual2009_2010.csv", header=TRUE, sep=",", FUN=as.POSIXct))
eats.2010 <- aets["2010-01::2010-10"]
G Garcia
fuente
4

Algunos puntos:

  1. No estoy seguro de por qué está sucediendo. Claramente, las ranuras POSIXlt están mal. Normalmente uso POSIXct a menos que sea absolutamente necesario ajustar las ranuras.
  2. Una opción es usar las fechas directamente en lugar de jugar con las ranuras, y decir <=y >=subconjunto. Algo comoae[ae$date >= as.POSIXlt("2009-10-01") & ae$date < as.POSIXlt("2009-11-01"),]
  3. Debería considerar usar una serie de tiempo para esto, ya que ese es el propósito exacto de esa estructura de datos (y proporcionan muchas funciones útiles para tratar los datos a lo largo del tiempo). Uno de los más comunes es zoo. xtsTambién incluye una serie de funciones que pueden ayudar con este tipo de cosas.
Shane
fuente
Gracias Shane, no he tenido ninguna experiencia analizando series de tiempo que probé brevemente dxts = as.xts (as.POSIXct (ae $ date_time)) pero no tuve suerte.
G Garcia
+1 para recomendar zoo. Haría tu tarea mucho más fácil. xtsestá destinado más a los implementadores de paquetes, aunque lo he usado directamente.
Wayne