2017-04-14 66 views
1

我有一個df格式化日期如下。長字符串日期到短日期R

Date      Year 
<chr>     <dbl> 
Sunday, Jul 27   2008 
Tuesday, Jul 29   2008 
Wednesday, July 31 (1) 2008 
Wednesday, July 31 (2) 2008 

是否有一種簡單的方法來實現以下格式的列和值?我還想在7月31日的日期刪除(1)和(2)符號。

Date   Year Month Day Day_of_Week 
2008-07-27 2008 07  27  Sunday 
+1

如果你打算做很多日期操縱我想看看裏面有很多的靈活性lubridate包。 – Elin

+0

你應該發佈這樣的結構的dput()版本(它可能是一個蹣跚,有點難以準確地重新創建)。 –

回答

2
library(dplyr) 
library(lubridate) 
dat = data_frame(date = c('Sunday, Jul 27','Tuesday, Jul 29', 'Wednesday, July 
31 (1)','Wednesday, July 31 (2)'), year=rep(2008,4)) 

dat %>% 
    mutate(date = gsub("\\s*\\([^\\)]+\\)","",as.character(date)), 
      date = parse_date_time(date,'A, b! d ')) -> dat1 
      year(dat1$date) <- dat1$year 

# A tibble: 4 × 2 
     date year 
     <dttm> <dbl> 
1 2008-07-27 2008 
2 2008-07-29 2008 
3 2008-07-31 2008 
4 2008-07-31 2008 
+0

請減少你的'庫'負載只有實際需要的包; 'tidyverse'是一個方便的超級軟件包,可以引入很多這裏不需要的其他軟件包。在這種情況下,我認爲它會是'dplyr'(和'lubridate')。 – r2evans

+0

有趣的是,你選擇'gsub' - 從他的問題中註釋掉。我沒有想到要做到這一點,好好保持完全/完全可重複的問題。 – r2evans

+0

我沒有想過只使用相關的軟件包,因爲tidyverse已經超過了我對任何單個軟件包的使用,謝謝。 –

4

隨着基礎R,你可以這樣做:

dat <- data.frame(
    Date = c("Sunday, Jul 27" ,"Tuesday, Jul 29", "Wednesday, July 31", "Wednesday, July 31"), 
    Year = rep(2008, 4), 
    stringsAsFactors = FALSE 
) 


dts <- as.POSIXlt(paste(dat$Year, dat$Date), format = "%Y %A, %B %d") 

POSIXlt提供的日期/時間基於列表的引用。要看到它們,請嘗試unclass(dts[1])

從這裏可以是相當學歷:

dat$Month = 1 + dts$mon # months are 0-based in POSIXlt 
dat$Day = dts$mday 
dat$Day_of_Week = weekdays(dts) 
dat 
#     Date Year Month Day Day_of_Week 
# 1  Sunday, Jul 27 2008  7 27  Sunday 
# 2 Tuesday, Jul 29 2008  7 29  Tuesday 
# 3 Wednesday, July 31 2008  7 31 Thursday 
# 4 Wednesday, July 31 2008  7 31 Thursday 
+0

我最終將簡單的月,日,星期計算代碼與上面的潤溼解決方案結合起來。感謝您的幫助! –