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)