2013-10-10 124 views
14

我有一個名爲「開始」的列日期時間(DD:MM:yyyy HH:mm:ss)的df,我想將此列分爲兩個名爲「日期」和「時間」。
現在我已經試過如下:分割日期時間

df$Date <- sapply(strsplit(as.character(df$Start), " "), "[", 1) 
df$Time <- sapply(strsplit(as.character(df$Start), " "), "[", 2) 

這個工作,但是,如果我使用的功能STR(DF)(我把它剪短,所以你可以看到大多是我所關注的變量)。

'data.frame':18363 obs。 19個變量:
$開始:因子w/67級別「2013-09-01 08:07:41.000」,..:1 1 1 1 1 1 1 1 1 1 ...
$ Interval:int 47259 47259 47259 47259 47259 47259 47259 47259 47259 47259 ...
$ DateTime:Factor w/18363 levels「2013-09-01 08:07:41.350」,..:1 2 3 4 5 6 7 8 9 10 .. 。
$時間檢測器:NUM 158489 158489 158490 158490 158491 ...


所以現在我只需要知道如何在時間和日期將從「因素」到「時間」和「日期」。

如果有人知道解決方案,我將非常感激!我是一個關於R的小菜,所以請不要把我燒到地面。

非常感謝!

+1

使用'sapply'而不是'lapply'當我使用的代碼。當'sapply'遇到一個「常規」結果時,它返回一個向量或矩陣。 'lapply'總是重新列表。 –

+0

就是這樣!非常感謝! – Jalalala

回答

9

對不起,對於這個遲到的答案!不管怎麼說,我接到了有人在學校的幫助,他想出了下面,我的時間碼非常簡單,調整..:

df$Date <- as.Date(df$Start) #already got this one from the answers above 
df$Time <- format(as.POSIXct(df$Start) ,format = "%H:%M:%S") 

此轉換的因素,以「日期」和「POSIXct」只是我想要它。

感謝大家的幫助!我希望我能在將來回到某種好處,但我懷疑它是否會與編程有關。

15

如何

df$Date <- as.Date(df$Start) 

df$Time <- format(df$Start,"%H:%M:%S") 
+0

這給了我這個錯誤..: Error.format.default(結構(as.character(x),names = names(x),dim = dim(x),: 無效'trim'參數 – Jalalala

+1

您有df $起始字符「字符」,它不是一個時間戳,使用class()函數進行檢查。在應用上述函數之前,應該將字符串轉換爲時間戳。 –

+1

Thanks,R將其讀爲一個因子。我已經獲得了一個實際上確實有「日期」作爲課程的日期。但是,現在我正在與時間搏鬥。我使用:df $ time < - as.POSIXlt(strptime(df $ Start,format =「[%Y-%m-%d%H:%M:%S]」))但它不起作用。仍在嘗試! – Jalalala

2

你可能更願意做這樣的事情,避免了使用lapply循環是不是真的有必要的(但也不是也不是什麼壞事!)...

# If we had this data... 
df <- data.frame(Start = c("13:11:2013 15:39" , "13:11:2013 16:15" , "13:11:2013 17:52")) 

# We can directly make two columns from the split strings without 
# using a loop by call 'do.call'.. 
new <- do.call(rbind , strsplit(as.character(df$Start) , " ")) 
#  [,1]   [,2] 
#[1,] "13:11:2013" "15:39" 
#[2,] "13:11:2013" "16:15" 
#[3,] "13:11:2013" "17:52" 


# Cbind them to the original data liek so... 
cbind(df , Date = new[,2] , Time = new[,1]) 
#    Start Date  Time 
#1 13:11:2013 15:39 15:39 13:11:2013 
#2 13:11:2013 16:15 16:15 13:11:2013 
#3 13:11:2013 17:52 17:52 13:11:2013 
+0

這似乎並沒有工作,但這可能是由於事實R閱讀它作爲因素..謝謝! – Jalalala

+0

@JalouHuntjens'as.character'應該注意這一點。我的例子中的數據也是「因素」。你可以在OP上添加'str(df)',這樣我就可以看到它的樣子了嗎? –

+0

@JalouHuntjens在您的數據上運行我的代碼時出現了哪些錯誤?它*應該*工作。 –

0

通過查看您的列格式,我會說您可以使用as.POSIXct正確格式化您的列,然後使用format()來提取所需的數據。

這是一個分裂DateTime列,

df$Time <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%H:%M:%S") 

df$Date <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%Y:%m:%d")