2014-10-01 30 views
2

我有一個R數據框列的日期格式爲字符串WK01Q32014格式化包含星期和季度作爲日期對象的日期字符串

我想將每個日期變成Date()對象。

所以我改變了格式,使其看起來像01-3-2014。例如,我想嘗試執行類似as.Date("01-3-2014","%W-%Q-%Y")的操作,但我不知道宿舍的格式代碼。

有沒有辦法使用lubridate,zoo或任何其他庫來做到這一點?

+0

Quarter + Week不會唯一指定一個日期。它如何知道每週的哪一天使用?你期望「WK01Q32014」成爲什麼? R日期值必須能夠解析爲月份+日期+年份。 – MrFlick 2014-10-01 22:06:53

+1

這與「一年中的一週」問題類似,但更頻繁......您需要確定哪一週被認爲是本季度的「第一週」。 – 2014-10-01 22:13:34

回答

1

我不知道任何特定功能,但這裏有一個基本的一個:

convert_WQ_to_Date <- function(D) { 
    weeks <- as.integer(substr(D, 3, 4)) 
    quarter <- as.integer(substr(D, 6, 6)) 
    year <- substr(D, 7, 10) 


    days <- 7 * ((quarter - 1) * 13 + (weeks-1)) 
    as.Date(sprintf("%s-01-01", year)) + days 
} 

D <- c("WK01Q32014", "WK01Q12014", "WK05Q42014", "WK01Q22014", "WK02Q32014") 

convert_WQ_to_Date(D) 
[1] "2014-07-02" "2014-01-01" "2014-10-29" "2014-04-02" "2014-07-09" 
+0

那麼你是否假設「第一」周有W00值?令人驚訝的是,「WK01Q12014」沒有返回1月1日,因爲到了8日,你應該在第二週。 – MrFlick 2014-10-01 22:18:39

+0

@MrFlick,哎呀!不,我已經忘記了' - 1'幾周了。我編輯了我的答案。感謝您的支持 – 2014-10-01 22:22:35

+1

這樣更好。你仍然做出很多假設(例如,每個季度每13周開始一次,不一定在每三個月的開始時),並且任何給定年度返回的一週中的某一天總是與第一天相同的一年。這並不是說這些假設是錯誤的,其他人可能對「第三季度第二週」的日期有不同的定義。這不是一個明確定義的術語。 – MrFlick 2014-10-01 22:25:30

1

當週,季,年沒有唯一確定一個日期,以便我們將不得不添加一些假設。這裏我們增加一個假設,即第一週是季度的第一天,第二週是7天后,依此類推,

下面,我們提取qtr年度部分並使用動物園包中的as.yearqtr進行轉換對yearqtr對象,然後使用as.Date將其轉換爲本季度的第一個日期。然後我們提取一週,減去1並乘以7得到天數抵消。添加第一季度到偏移給出結果:

library(zoo) 

xx <- "01-3-2014" # week-quarter-year 
qtr.start <- as.Date(as.yearqtr(sub("...", "", xx), "%q-%Y")) 
days <- 7 * (as.numeric(sub("-.*", "", xx)) - 1) 
qtr.start + days 
## [1] "2014-07-01" 
0

假設每個季度的傳統觀念分別在1月1日開始,4月1日,7月1日和9月1日(與quarters功能線) ,從這些日期開始,每週添加7天:

x <- c("01-3-2014","01-1-2014","05-4-2014","01-2-2014","02-3-2014") 

y <- as.numeric(substr(x,6,9)) 
m <- as.numeric(substr(x,4,4)) 
d <- as.numeric(substr(x,1,2)) 

as.Date(paste(y,(m-1)*3+1,"01",sep="-")) + (7*(d-1)) 
#[1] "2014-07-01" "2014-01-01" "2014-10-29" "2014-04-01" "2014-07-08"