2017-02-21 2 views
1

J'ai des données à un intervalle de 0,1 seconde ou 10 lignes pendant une seconde Donc 864000 lignes pour un jour basé sur 24 * 60 * 60 * 10 . Je veux trouver la moyenne des colonnes (la vitesse du vent et d'autres variables non montrées ici) dans mes données en l'agrégeant de 0.1 seconde pas de temps à une demi-heure. Ainsi, les données sont agrégées à partir 864000 lignes à 48 lignes (pour un jour)pas de temps de 0,1 seconde à demi-heure (30 minutes) avec heures décimales UTC

Entrée:

  tms Hr Min Sec Wind speed 
7/13/2014 0:00 0 0 0 3.45 
7/13/2014 0:00 0 0 0.1 52.34 
7/13/2014 0:00 0 0 0.2 1.23 
7/13/2014 0:00 0 0 0.3 4.3 
7/13/2014 0:00 0 0 0.4 1.34 
7/13/2014 0:00 0 0 0.5 3.6 

sortie Je veux voir:

Year Month Day Hr Wind speed 
7/13/2014 7 13 0 21.92 
7/13/2014 7 13 0.5 29.38 
7/13/2014 7 13 1 24.18 
7/13/2014 7 13 1.5 1.70 
7/13/2014 7 13 2 1.80 

Mon code pour la moyenne horaire et je veux changer pour agréger les données par demi-heure (pas une heure). Où dat est la colonne de données sans tms: j'ai donc ajouté une colonne de date.

library(data.table) 
library(xts) 
dat <- data.table(dat) 
tms <- as.POSIXct(seq(0,24*(60*60*10)-1,by=1),origin="2014-07-13",tz="UTC") 
xts.ts <- data.frame(xts(dat,tms)) 

Maintenant, j'ajouté tms colonne à mes données

Aut <- data.frame(tms,xts.ts, check.names=FALSE, row.names=NULL) 
mean2 <- aggregate(Aut, 
        list(hour=cut(as.POSIXct(Aut$tms), "hour")), 
        mean) 

Mais ce ne corrigera pas même pour toutes les heures. Je veux dire mes données par demi-heure. Aucune suggestion?

+0

Ce n'est pas clair pour moi ce que vous voulez que la sortie soit. L'agrégation par le temps est facile avec xts, mais vous n'avez pas fourni une entrée reproductible ('dat' n'est pas définie) ou un exemple de la sortie que vous attendez. Fournissez ces deux choses et vous recevrez probablement plusieurs réponses. –

+0

je l'ai édité, mais il a probablement besoin de mise en forme – Wisconsin

+0

@JoshuaUlrich Je l'ai édité et fourni la sortie, mais je ne sais pas ce qui est arrivé à la mise en forme. Je veux des valeurs moyennes de 0,1 seconde étape à 30 minutes (0,5 heure). donc rouler les données de 864000 lignes à 48 lignes pour un jour – Wisconsin

Répondre

1

Comme je l'ai mentionné dans mon commentaire, vous pouvez le faire facilement avec xts::period.apply:

library(xts) 
options(digits.secs = 1) # display fractional seconds 
# create 1 day of timestamps that are 0.1 seconds apart 
tms <- as.POSIXct(seq(0, 86400-1, by=0.1), origin="2014-07-13", tz="UTC") 
# create an xts object with some random data and the times created above 
set.seed(21) 
xts.ts <- xts(runif(length(tms), 0, 50), tms) 
# use period.apply and endpoints to calculate the 30-minute means 
mean30min <- period.apply(xts.ts, endpoints(xts.ts, "mins", 30), mean) 
# round up to next 30-minute period 
mean30min <- align.time(mean30min, 60*30) 

Si vous voulez que le résultat soit un data.table ou data.frame avec les colonnes supplémentaires ajoutées, vous pouvez le faire cela facilement après l'agrégation.

library(data.table) 
dt.mean30 <- as.data.table(mean30min) 
dt.mean30[, Month := .indexmon(mean30min) + 1] 
dt.mean30[, Day := .indexmday(mean30min)] 
dt.mean30[, Hr := .indexhour(mean30min) + .indexmin(mean30min)/60] 
+0

@ Joshuha Merci. quand j'ai appliqué la période .apply "Erreur dans les points de terminaison (xts.ts," min ", 30): argument" on "non supporté" Aussi la longueur de tms devrait être 864000 (que je peux essayer de fixer) – Wisconsin

+0

@Kristofersen ..... – Wisconsin

+0

@Wisconsin: fixe. Voir ma modification. –