R Data.table 日期时间变量与 IDate.Time 分开的变量
R Data.table datetime variable into separate variable with IDate.Time
我有一个日期时间变量 (vardt
) 作为数据 table 中的一个字符串。
例如。 "21/07/2011 15:54:57"
我想将日期和时间分成不同的变量。我可以使用以下代码快速完成。
DT <- DT[,"time":= substr(vardt,12,19)]
DT <- DT[,"date":= substr(vardt,1,10)]
但是,当我尝试将变量放入 POSIX 格式时,它崩溃了。
DT <- DT[,"date":= as.IDate(substr(vardt,1,10))]
我需要 POSIX 格式,以便在特定时间(例如上午 10 点之前)对所有观察结果进行子集化。任何人都知道我在这里做错了什么?欢迎任何想法
*我有数百万个观察结果,所以我真的需要效率。
试试 strsplit(column_name, " ")
当你尝试 DT[,"date":= as.IDate(substr(vardt,1,10))]
时,我不太确定你所说的 "it crashes" 是什么意思 - 这确实给了我 class [=17] 的专栏 date
=];只是格式不正确:
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 <- DT[,newCol:="xyz"]
22=].
数据:
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)
我有一个日期时间变量 (vardt
) 作为数据 table 中的一个字符串。
例如。 "21/07/2011 15:54:57"
我想将日期和时间分成不同的变量。我可以使用以下代码快速完成。
DT <- DT[,"time":= substr(vardt,12,19)]
DT <- DT[,"date":= substr(vardt,1,10)]
但是,当我尝试将变量放入 POSIX 格式时,它崩溃了。
DT <- DT[,"date":= as.IDate(substr(vardt,1,10))]
我需要 POSIX 格式,以便在特定时间(例如上午 10 点之前)对所有观察结果进行子集化。任何人都知道我在这里做错了什么?欢迎任何想法
*我有数百万个观察结果,所以我真的需要效率。
试试 strsplit(column_name, " ")
当你尝试 DT[,"date":= as.IDate(substr(vardt,1,10))]
时,我不太确定你所说的 "it crashes" 是什么意思 - 这确实给了我 class [=17] 的专栏 date
=];只是格式不正确:
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 <- DT[,newCol:="xyz"]
22=].
数据:
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)