2017-04-12 19 views
0

找到不同的時間間隔我有日期的向量,看起來像這樣:如何在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"

,並聲明爲POSIXct。我需要找到這個向量中不同時間間隔的開始和結束時間。此日期有2個時間間隔:從"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"

我試過命令範圍(數據),但我得到整個向量的開始日期和結束日期,而不是不同的時間間隔。希望有人能幫助

+0

你是如何定義不同的時間間隔?任何不是10分鐘不同?查看'diff(vecdates)'來檢查連續值之間的差異。 – thelatemail

+0

@thelatemail是啊,任何不是10分鐘 –

回答

0

使用時間之間存在一些差異,以找到您的載體,我已經叫tx(代碼下面創建)破發點:正如你所看到的,結果分成8:409:10然後10:30到最後。

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是:

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

幾乎完美,但每個「正確」的時間間隔的最後日期是去下一個。 'cumsum(c(FALSE,diff(tx)!= 10))'完美,但'split(tx,cumsum(c(FALSE,diff(tx)!= 10)))'不會 –

+0

@ alejandroandrade - 我不知道這是怎麼可能的 - 'split'根據'cumsum'值分成組。如果一個有效,另一個也應該。 – thelatemail

+0

我不好,我錯過了'FALSE'。感謝您的回答 –

0

假設你把你所有的日期在名爲向量「日期」你可以不喜歡以下

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

它工作2小時,但我需要它10分鐘,說實話,從@thelatemail答案完美解決它。無論如何感謝 –

0

如果在此輸入策略替換文本你得到日期時間的載體:

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

然後,你可以使用findInterval來分類日期,並選擇一個與你想要的間隔指定,1和3在你的情況。

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

你似乎在這裏得到4間隔,而不是2 – thelatemail

+0

而我現在必須在做它之前的間隔,我實際上有10.000日期,所以它不是自動的。無論如何感謝 –