当您尝试DT[,"date":= as.IDate(substr(vardt,1,10))] 时,我不太清楚您所说的“它崩溃”是什么意思 - 这确实给了我一个 date 类 IDate 的列;只是格式不正确:
vardt date
1: 24/01/2015 04:31:36 24-01-20
2: 24/01/2015 09:19:36 24-01-20
3: 23/01/2015 17:29:36 23-01-20
4: 24/01/2015 01:25:36 24-01-20
5: 24/01/2015 01:55:36 24-01-20
您可以通过指定format 来解决此问题:
DT[,date:=as.IDate(substr(vardt,1,10),"%d/%m/%Y")]
DT[,time:=as.ITime(substr(vardt,12,19))]
R> DT
vardt date time
1: 24/01/2015 04:31:36 2015-01-24 04:31:36
2: 24/01/2015 09:19:36 2015-01-24 09:19:36
3: 23/01/2015 17:29:36 2015-01-23 17:29:36
4: 24/01/2015 01:25:36 2015-01-24 01:25:36
5: 24/01/2015 01:55:36 2015-01-24 01:55:36
---
97: 23/01/2015 15:55:36 2015-01-23 15:55:36
98: 23/01/2015 23:06:36 2015-01-23 23:06:36
99: 24/01/2015 10:29:36 2015-01-24 10:29:36
100: 23/01/2015 23:07:36 2015-01-23 23:07:36
101: 24/01/2015 01:27:36 2015-01-24 01:27:36
然后您可以使用hour 函数按照您的意愿继续,例如
R> head(DT[hour(time)<10,])
vardt date time
1: 24/01/2015 04:31:36 2015-01-24 04:31:36
2: 24/01/2015 09:19:36 2015-01-24 09:19:36
3: 24/01/2015 01:25:36 2015-01-24 01:25:36
4: 24/01/2015 01:55:36 2015-01-24 01:55:36
5: 24/01/2015 04:10:36 2015-01-24 04:10:36
6: 24/01/2015 01:51:36 2015-01-24 01:51:36
或
R> DT[,.(Freq=.N),by=hour(time)][order(hour)]
hour Freq
1: 0 2
2: 1 10
3: 2 4
4: 3 3
5: 4 2
6: 5 1
7: 6 3
8: 7 1
9: 8 6
10: 9 4
11: 10 3
12: 11 3
13: 12 6
14: 13 3
15: 14 4
16: 15 8
17: 16 3
18: 17 6
19: 18 2
20: 19 7
21: 20 5
22: 21 7
23: 22 5
24: 23 3
还请注意,当您使用 := 通过引用分配/修改时,您不必将对象重新分配给它自己 - 因此您可以使用 DT[,newCol:="xyz"] 而不是 DT <- DT[,newCol:="xyz"]。
数据:
x <- Sys.time()+sample(seq(0,24*3600,60),101,TRUE)
##
x <- gsub(
"(\\d+)\\-(\\d+)\\-(\\d+)",
"\\3/\\2/\\1",
x)
##
DT <- data.table(vardt=x)