2016-12-26 85 views
0

我被困在一列中,其中包含日期和时间。R中的日期和时间列

我列如下:

Date.Rept 
12/1/2016 
12/1/2013 12:07 AM 
12/1/2016 7:76 AM 
12/1/2016 11:54 AM 
12/2/2016 1:34 PM 

我的目标是将日期和时间分成两个单独的列。

我首先将数据框中的所有内容都更改为as.character,然后使用下面的代码获取该列中的日期。

如何将时间提取到单独的列中,以便我有两列只有数据,另一列有时间?

代码用于:crime$Date.Rept <- as.Date(crime$Date.Rept, "%m/%d/%Y %H:%M")

结果:2016-12-01

+1

什么是'7:76 AM'? –

回答

1

我们可以将extracttidyr尝试捕获的一个或多个非空格字符后接零个的基团((\\S+))以分离成两列或多个空格(\\s*),接着任意字符作为第二捕获组((.*)

library(tidyr) 
extract(crime, Date.Rept, into = c("Date", "Time"), "(\\S+)\\s*(.*)") 
#  Date  Time 
#1 12/1/2016   
#2 12/1/2013 12:07 AM 
#3 12/1/2016 7:76 AM 
#4 12/1/2016 11:54 AM 
#5 12/2/2016 1:34 PM 

或者另一种选择是从base R

read.csv(text=sub("\\s+", ",", crime$Date.Rept), header=FALSE, 
      col.names = c("Date", "Time"), stringsAsFactors=FALSE) 
#  Date  Time 
#1 12/1/2016   
#2 12/1/2013 12:07 AM 
#3 12/1/2016 7:76 AM 
#4 12/1/2016 11:54 AM 
#5 12/2/2016 1:34 PM 
+0

这很棒!谢谢。现在仅仅是为了我自己的知识,我得到了提取部分,但是......我们基本上在第一个空白区域和第二个捕获组中的任何后续空白区域分别进行了说明。 – sabih4911

+0

@ sabih4911第一个用'extract'捕获'Date'中的非空白字符,然后匹配任何空格,第二个组捕获所有其他字符(如果存在)。同样,在第二种情况下,我们用','替换第一个空格,并使用'read.csv'将它看作两列,用','作为分隔符。 – akrun

+0

@ sabih4911您也可以勾选[here](http://stackoverflow.com/help/someone-answers) – akrun

1

sub/read.csv通过看你的代码看起来像你实际上是试图转换到DateTime类(你使用as.Date),基础R不有一个Time类,但您可以尝试data.table。我添加了一个预处理步骤,以便处理缺少时间的值(并且我不知道什么时间是7:76),但生成的列很容易操作(添加/订阅/过滤器等)。

library(data.table) 
setDT(crime)[nchar(as.character(Date.Rept)) < 18, Date.Rept := paste(Date.Rept, "12:00 AM")] 
crime[, c("Date", "Time") := IDateTime(as.POSIXct(Date.Rept, format = "%m/%d/%Y %I:%M %p"))] 
crime 
#   Date.Rept  Date  Time 
# 1: 12/1/2016 12:00 AM 2016-12-01 00:00:00 
# 2: 12/1/2013 12:07 AM 2013-12-01 00:07:00 
# 3: 12/1/2016 7:76 AM  <NA>  <NA> 
# 4: 12/1/2016 11:54 AM 2016-12-01 11:54:00 
# 5: 12/2/2016 1:34 PM 2016-12-02 13:34:00 
0

选项1: 看起来你的数据可能是strsplit()的一个很好的候选者。此选项将需要一些额外的工作,因为此strsplit()函数将生成拆分向量值的列表。选项2:我的个人偏好是使用tidyr()包分割数据。

crime2 <- separate(crime, Date.Rept, c("date.value", "time.value"), sep = " ") 

这将创建一个数据框,然后需要将其附加回原始文件。您可以通过以下方式轻松完成此任务。

crime3 <- cbind(crime,crime2) 

对于任何额外的日期操作或比较,您可以考虑使用lubridate()包。我发现这个软件包比基本的日期工具更容易使用。