2016-12-26 118 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()包。我發現這個軟件包比基本的日期工具更容易使用。