2010-11-30 73 views
10

我對R相對較新,但這是我第一次必須處理日期轉換。我從CSV讀取數據(使用read.table()),但是我縮短了數據以突出顯示我的問題。當讀入R時,日期字段是字符。將字符轉換爲R中的日期

簡單地說,除了少數情況外,我的大部分日期都會被正確強制。下面的例子會希望告訴你發生了什麼。

# my attempt to coerce the date -- uses the stringr package 
prods.all$Date2 <- as.Date(str_sub(prods.all$Date, 1, 
       str_locate(prods.all$Date, " ")[1]-1), 
       "%m/%d/%Y") 

# grab two rows to highlight my issue 
temp <- prods.all[c(1925:1926), c(1,8)] 

> temp 
        Date  Date2 
1925 10/9/2009 0:00:00 2009-10-09 
1926 10/15/2009 0:00:00 0200-10-15 

正如您所看到的,某些日期的年份並不準確。這種模式似乎發生在一天是兩位數的時候。

我已經瀏覽了幾本書,並試圖Google更好的方式,但一切似乎表明,我的數據輸入格式不正確。

鑑於R的功能強大,我認爲有一種非常簡單的方法可以強制我的列成爲有效的日期,並且我忽略了一個非常明顯的解決方案。

任何幫助,您可以提供將不勝感激。

+0

的原因,你所得到的是無效0200的日期是一天中的字符長度不同(15-Oct爲兩位數字,9-10月爲一位數字) - 而您的字符串替換代碼並不能解釋這一點。無論如何,您可以直接使用as.Date或strptime格式agument,而無需進一步處理字符。 – mdsumner 2010-11-30 04:21:06

回答

24

您可能會過於複雜的東西,是否有任何理由需要stringr包?

df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00")) 
as.Date(df$Date, "%m/%d/%Y %H:%M:%S") 

[1] 「2009-10-09」, 「2009-10-15」

更一般地,如果需要的時間分量爲好,使用strptime:

strptime(df$Date, "%m/%d/%Y %H:%M:%S") 

我猜測你的實際數據可能會從你給出的部分結果中看出來。

+0

我會提防`strptime`,因爲它會返回一個'POSIXlt`對象,這往往會讓新用戶適應,因爲他們沒有意識到這是一個列表。如果您需要時間,請使用`as.POSIXct`,但要小心如果您的「日期」真的是因素... – 2010-11-30 04:44:30

+1

是真的,但因爲R 2.11.0「長度()現在返回相應抽象時間向量的長度而不是總是9(基礎列表結構的長度)(公關#14073和公關#10507的願望)「所以我想知道這是否值得使用複雜的東西。無論如何,你可以像as.POSIXct(strptime(x))一樣。 – mdsumner 2010-11-30 06:19:26

30

最簡單的方法是使用lubridate:

library(lubridate) 
prods.all$Date2 <- mdy(prods.all$Date2) 

此功能自動返回POSIXct類的對象,將與任何因素或字符工作。

-1

library(lubridate) 如果你的日期格式是這樣的'04 /2017分之2405:35:00'then改變它像下面 prods.all$Date2<-gsub("/","-",prods.all$Date2) 然後更改日期格式 parse_date_time(prods.all$Date2, orders="mdy hms")