【问题标题】:R Data.table datetime variable into separate variable with IDate.TimeR Data.table 日期时间变量与 IDate.Time 成单独的变量
【发布时间】:2015-01-23 19:24:55
【问题描述】:

我在数据表中有一个日期时间变量 (vardt) 作为字符串。 例如。 "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 点之前)对所有观察结果进行子集化。任何人都知道我在这里做错了什么?欢迎任何想法

*我有数百万的观察结果,所以我真的需要效率。

【问题讨论】:

  • 如果拆分日期时间,使用小时会更加困难。您可能希望将其保留为一列并使用as.POSIXct(),然后您可以对结果使用(某些)数学方法。或查看包裹chron

标签: r string datetime data.table


【解决方案1】:

当您尝试DT[,"date":= as.IDate(substr(vardt,1,10))] 时,我不太清楚您所说的“它崩溃”是什么意思 - 这确实给了我一个 dateIDate 的列;只是格式不正确:

                   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 &lt;- 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)

【讨论】:

    【解决方案2】:

    试试 strsplit(column_name, " ")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多