2013-12-09 36 views
1

我是R新人。我的數據有三個屬性定義的600k對象:Id,DateTimeOfCallR中的分級時間系列?

TimeofCall有一個00:00:00格式和範圍從00:00:0023:59:59

我想將TimeOfCall屬性分成24個分檔,每個分檔代表小時位(第一個分檔00:00:0000:59:59等)。

有人可以通過我如何做到這一點?我嘗試使用cut(),但顯然我的格式不是數字。提前致謝!

+0

【如何使一個偉大的[R重複的例子?(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – zero323

+0

你想添加一個bin列到你的data.frame?或者你有不同的數據結構? – Milktrader

+0

你好Milktrader, 這是data.frame,是的,這將工作。 – Palcente

回答

1

雖然你可以轉換成正式的時間表示,在這種情況下,它可能會更容易,只需使用substr

test <- c("00:00:01","02:07:01","22:30:15") 
as.numeric(substr(test,1,2)) 
#[1] 0 2 22 

使用POSIXct時間來對付它也將工作,並且可能是方便的,如果您計劃進一步計算(時間差異等):

testtime <- as.POSIXct(test,format="%H:%M:%S") 
#[1]"2013-12-09 00:00:01 EST" "2013-12-09 02:07:01 EST" "2013-12-09 22:30:15 EST" 
as.numeric(format(testtime,"%H")) 
#[1] 0 2 22 
+0

這個工作就像一個魅力,謝謝! 第二種方法非常好!我相信我會更頻繁地使用它! 快速的一個,如果我要從日期中提取一週中的幾天,我是否也可以使用POSIXct? – Palcente

+0

@Palcente - 如果你已經有了一個Date變量(或者一個POSIXct/POSIXlt日期時間),你可以使用格式'format(datevar,「%w」)',其結果是0-6,星期天是0。 – thelatemail

+0

如果我的日期如下,你能告訴我什麼是我的POSIXct格式:01-Jan-09 ...會格式=「%d-%b-%y」? – Palcente

0

您可以使用cut.POsixlt函數。但是你應該強制你的數據到一個有效的時間對象。這裏我使用lubridate得心應手的hms。和strftime獲取時間格式。

library(lubridate) 
x <- c("09:10:01", "08:10:02", "08:20:02","06:10:03 ", "Collided at 9:20:04 pm") 
x.h <- strftime(cut(as.POSIXct(hms(x),origin=Sys.Date()),'hours'), 
     format='%H:%M:%S') 

data.frame(x,x.h) 

         x  x.h 
1    09:10:01 10:00:00 
2    08:10:02 09:00:00 
3    08:20:02 09:00:00 
4    06:10:03 07:00:00 
5 Collided at 9:20:04 pm 22:00:00