我有一個R數據框列的日期格式爲字符串WK01Q32014
。格式化包含星期和季度作爲日期對象的日期字符串
我想將每個日期變成Date()
對象。
所以我改變了格式,使其看起來像01-3-2014
。例如,我想嘗試執行類似as.Date("01-3-2014","%W-%Q-%Y")
的操作,但我不知道宿舍的格式代碼。
有沒有辦法使用lubridate
,zoo
或任何其他庫來做到這一點?
我有一個R數據框列的日期格式爲字符串WK01Q32014
。格式化包含星期和季度作爲日期對象的日期字符串
我想將每個日期變成Date()
對象。
所以我改變了格式,使其看起來像01-3-2014
。例如,我想嘗試執行類似as.Date("01-3-2014","%W-%Q-%Y")
的操作,但我不知道宿舍的格式代碼。
有沒有辦法使用lubridate
,zoo
或任何其他庫來做到這一點?
我不知道任何特定功能,但這裏有一個基本的一個:
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"
那麼你是否假設「第一」周有W00值?令人驚訝的是,「WK01Q12014」沒有返回1月1日,因爲到了8日,你應該在第二週。 – MrFlick 2014-10-01 22:18:39
@MrFlick,哎呀!不,我已經忘記了' - 1'幾周了。我編輯了我的答案。感謝您的支持 – 2014-10-01 22:22:35
這樣更好。你仍然做出很多假設(例如,每個季度每13周開始一次,不一定在每三個月的開始時),並且任何給定年度返回的一週中的某一天總是與第一天相同的一年。這並不是說這些假設是錯誤的,其他人可能對「第三季度第二週」的日期有不同的定義。這不是一個明確定義的術語。 – MrFlick 2014-10-01 22:25:30
當週,季,年沒有唯一確定一個日期,以便我們將不得不添加一些假設。這裏我們增加一個假設,即第一週是季度的第一天,第二週是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"
假設每個季度的傳統觀念分別在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"
Quarter + Week不會唯一指定一個日期。它如何知道每週的哪一天使用?你期望「WK01Q32014」成爲什麼? R日期值必須能夠解析爲月份+日期+年份。 – MrFlick 2014-10-01 22:06:53
這與「一年中的一週」問題類似,但更頻繁......您需要確定哪一週被認爲是本季度的「第一週」。 – 2014-10-01 22:13:34