Sous-ensemble d'une trame de données dans R en fonction des dates [fermé]

8

J'ai un ensemble de données avec une structure semblable à un fichier journal très simple, je veux sous-ensemble les données en fonction des plages de dates, mais je ne peux le faire que sur un paramètre.

mes données ressemblent à ceci:

            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

le fichier comprend des données pour une année entière, je veux créer des graphiques récapitulatifs pour chaque mois et peut-être la semaine

Je traite la date_heure comme suit:

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

maintenant j'essaye de sous-définir les données comme:

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

"110" est dû au fait que:

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

J'ai également essayé ce qui suit sans succès:

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

ceux-ci fonctionnent cependant:

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

et cela aussi

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

des idées sur comment puis-je sous-ensemble en sélectionnant à la fois l'année et le mois?

Merci,

G Garcia
la source
2
Votre code ne fonctionne pas car les composants d'un objet POSIXlt sont numériques / entiers, pas des caractères. Mais comme Shane l'a dit, vous devriez vraiment utiliser une classe de séries chronologiques ...
Joshua Ulrich
oui, si vous remarquez que j'ai déjà posté la solution ci-dessous il y a quelques jours.
G Garcia

Réponses:

6

ok séries temporelles semblent avoir fait l'affaire:

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
la source
4

Quelques points:

  1. Je ne sais pas pourquoi cela se produit. De toute évidence, les emplacements POSIXlt sont incorrects. J'utilise généralement POSIXct, sauf si j'ai absolument besoin d'ajuster les emplacements.
  2. Une option consiste à utiliser les dates directement plutôt que de jouer avec les créneaux horaires, et de dire <=et >=de sous-ensemble. Quelque chose commeae[ae$date >= as.POSIXlt("2009-10-01") & ae$date < as.POSIXlt("2009-11-01"),]
  3. Vous devriez envisager d'utiliser une série temporelle pour cela, car c'est le but exact de cette structure de données (et elles fournissent de nombreuses fonctions utiles pour traiter les données au fil du temps). L'un des plus courants est zoo. xtscomprend également un certain nombre de fonctions qui peuvent aider avec ce genre de chose.
Shane
la source
Merci Shane, je n'ai eu aucune expérience dans l'analyse de la série temporelle. J'ai essayé brièvement dxts = as.xts (as.POSIXct (ae $ date_time)) mais je n'ai pas eu de chance, des pointeurs?
G Garcia
+1 pour recommander zoo. Cela rendrait votre tâche beaucoup plus facile. xtsest plus destiné aux implémenteurs de packages, même si je l'ai utilisé directement.
Wayne