2017-04-12 1 views
0

J'ai un vecteur de dates qui ressemble à ceci:Comment trouver différents intervalles de temps en r

"2017-01-05 08:40:00 COT" "2017-01-05 08:50:00 COT" "2017-01-05 09:00:00 COT" "2017-01-05 09:10:00 COT" "2017-01-05 10:30:00 COT" "2017-01-05 10:40:00 COT" "2017-01-05 10:50:00 COT" "2017-01-05 11:00:00 COT" "2017-01-05 11:10:00 COT" "2017-01-05 11:20:00 COT" "2017-01-05 11:30:00 COT" "2017-01-05 11:40:00 COT""2017-01-05 11:50:00 COT" "2017-01-05 12:00:00 COT" "2017-01-05 12:10:00 COT" "2017-01-05 12:20:00 COT" "2017-01-05 12:30:00 COT" "2017-01-05 12:40:00 COT" "2017-01-05 12:50:00 COT" "2017-01-05 13:00:00 COT" "2017-01-05 13:10:00 COT" "2017-01-05 13:20:00 COT" "2017-01-05 13:30:00 COT" "2017-01-05 13:40:00 COT""2017-01-05 13:50:00 COT" "2017-01-05 14:00:00 COT" "2017-01-05 14:10:00 COT" "2017-01-05 14:20:00 COT" "2017-01-05 14:30:00 COT" "2017-01-05 14:40:00 COT" "2017-01-05 14:50:00 COT" "2017-01-05 15:00:00 COT"

et sont déclare que POSIXct. J'ai besoin de trouver l'heure de début et de fin des différents intervalles de temps dans ce vecteur. Pour cette date il y a 2 intervalles de temps: De "2017-01-05 08:40:00 COT" à "2017-01-05 09:10:00 COT" et de "2017-01-05 10:30:00 COT" à "2017-01-05 15:00:00 COT".

J'ai essayé la plage de commande (données) mais j'ai la date de début et la date de fin du vecteur entier et pas les différents intervalles. Espérons que quelqu'un peut aider

+0

Comment définissez-vous les différents intervalles? Tout n'est pas différent de 10 minutes? Consultez 'diff (vecdates)' pour vérifier les différences entre les valeurs consécutives. – thelatemail

+0

@thelatemail ouais rien de moins 10 min –

Répondre

0

En utilisant quelques différences entre les temps de trouver les points de rupture dans votre vecteur, que je l'ai appelé tx (code pour créer ci-dessous): Comme vous pouvez le voir, les résultats divisé en 8:40-9:10 puis 10:30 jusqu'à la fin.

diff(tx) 
#Time differences in mins 
#[1] 10 10 10 80 10 10 10 

cumsum(c(FALSE, diff(tx)!=10)) 
#[1] 0 0 0 0 1 1 1 1 

split(tx, cumsum(c(FALSE, diff(tx)!=10))) 
#$`0` 
#[1] "2017-01-05 08:40:00 COT" "2017-01-05 08:50:00 COT" "2017-01-05 09:00:00 COT" "2017-01-05 09:10:00 COT" 
# 
#$`1` 
#[1] "2017-01-05 10:30:00 COT" "2017-01-05 10:40:00 COT" "2017-01-05 10:50:00 COT" "2017-01-05 11:00:00 COT" 

tx était:

tx <- structure(c(1483623600, 1483624200, 1483624800, 1483625400, 1483630200, 
1483630800, 1483631400, 1483632000), class = c("POSIXct", "POSIXt" 
), tzone = "America/Bogota") 
+0

fonctionne presque parfait, mais la dernière date de chaque "correcte" intervalle va à la suivante. Le 'cumsum (c (FAUX, diff (tx)! = 10))' fonctionne parfaitement, mais le 'split (tx, cumsum (c (FAUX, diff (tx)! = 10)))' ne pas –

+0

@ alejandroandrade - Je ne sais pas comment c'est possible - 'split' se divise simplement en groupes basés sur les valeurs' cumsum'. Si l'un travaille, l'autre devrait aussi. – thelatemail

+0

mon mauvais je manquais le 'FAUX '. Merci pour la réponse –

0

En supposant que vous mettez toutes vos dates dans un vecteur appelé « Dates » vous pouvez faire quelque chose comme ce qui suit

Ranges <- cut(dates, breaks = "2 hours") 
+0

Cela fonctionne pendant 2 heures mais j'en ai besoin pendant 10 minutes et pour être honnête la réponse de @thelatemail le résout parfaitement. de toute façon merci –

0

Si vous remplacez votre texte dans cette stratégie d'entrée que vous obtenez un vecteur de datetimes :

dat <- as.POSIXct(scan(text=' ... ',quote="\"",what="")) 
# Don't use spaces flanking the ellipsis 

Ensuite, vous pouvez utiliser findInterval pour classer les dates et sélectionnez l'une avec la désignation d'intervalle que vous désirez, 1 et 3 dans votre cas.

Breaks <- scan(text='"2017-01-05 08:40:00 COT","2017-01-05 09:10:00 COT","2017-01-05 10:30:00 COT" , "2017-01-05 15:00:00 COT"', sep=",", what="") 
# Read 4 items 
findInterval(dat, as.POSIXct(Breaks)) 
# [1] 1 1 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 
+0

Vous semblez obtenir 4 intervalles ici au lieu de 2 – thelatemail

+0

Et je devrais maintenant les intervalles avant de le faire et j'ai réellement 10.000 dates donc ce n'est pas automatique. Merci quand même –