2013-03-07 138 views
14

我有一個包含位置和日期的數據集。我想計算一年的週數爲(00-53),但將週四用作一週的第一天。數據是這樣的:計算一年中的週數(0-53)

location <- c(a,b,a,b,a,b) 
    date <- c("04-01-2013","26-01-2013","03-02-2013","09-02-2013","20-02-2013","03-03-2013") 
    mydf <- data.frame(location, date) 
    mydf 

我知道,有計算的星期strftime函數,但它是唯一可能使用或星期一星期日作爲一週的第一天。 任何幫助將不勝感激。

+0

如果我可以問,你爲什麼要這麼做? – Arun 2013-03-07 17:56:36

+3

所以如果一個星期二開始,第一週是週二/週三,第二週週四開始......? – joran 2013-03-07 17:57:07

+0

是的。周應該從週二到週三。 – Eco06 2013-03-07 18:01:11

回答

22

只需添加4到日期格式值:

> mydf$Dt <- as.Date(mydf$date, format="%d-%m-%Y") 
> weeknum <- as.numeric(format(mydf$Dt+3, "%U")) 
> weeknum 
[1] 1 4 5 6 7 9 

這將使用0基於統計慣例,因爲這是strftime的提供,我們只是捎帶關閉該代碼庫,所以在第一個星期五從週二開始的2013年的情況將是1周的結果。如果您需要基於1的約定,請將1加1。 (基本上,日期格式的值是從「起源」開始的整數序列,因此它們不會真正識別年或周,添加4只是移位基礎日期整數的參考幀。)

編輯說明。根據Gabor的建議,改爲增加三個策略。 ......仍未解決如何處理上一年最後一週的問題。

+1

有一些問題,關於星期數的定義是什麼,但是在問題的6個日期之前的一年中,分別有1,4,5,6,7,9個星期四的任何比率,這就提出了答案中的8是否正確的問題。另外'格式(as.Date(「2013-12-31」)+ 4,「%U」)'給出00. – 2013-03-07 20:55:51

+0

「add-4」策略會在星期四創建一個增量,所以每週四的計數是一致的採用「加3」策略。 – 2013-03-07 21:19:03

+0

對於年終問題的修復可能是在12月減去7天,然後在周計數中加1: 'ifelse(months(d)==「December」, \t as.numeric(format( (格式(d + 3,「%U」)))''d + 4,「%U」))+ 1, \t as.numeric – 2013-03-07 22:22:07

2

因爲這個問題指出,本週00-53進入我們假設週數是週四的數量在一年或有問題的日期之前。因此,一年中的第一個星期四開始第1周和第0周被分配到之前的任何日子。

(有人評論說,如果一年中的第一天是星期二,那麼這將是第一週,但如果是這種情況,那麼可能永遠不會有第0周,因爲似乎需要在主題中進行澄清,可能需要定義星期編號,在這裏我們要使用前一段中的定義,但是如果我們知道定義是什麼,就不難改變它,例如,如果我們一直想要第一週即使是短周,那麼我們也可以在結果中加上!is.thu(jan1(d))。)

下面的兩個解決方案都足夠短,可以用一個語句表達;但是,爲了清楚起見,我們將它們分解爲幾個簡短的函數。第一個是非常直接的,但第二個是自動矢量化而不需要sapply,並且可能更有效率。

1和週四在一年該解決方案假設輸入d"Date"類的,只是總結週四的數量在今年前或在其上:

is.thu <- function(x) weekdays(x) == "Thursday" 
jan1 <- function(x) as.Date(cut(x, "year")) 

week4 <- function(d) { 
    sapply(d, function(d) sum(is.thu(seq(jan1(d), d, by = "day")))) 
} 

我們可以測試它像這樣:

d <- as.Date(c("2013-01-04", "2013-01-26", "2013-02-03", "2013-02-09", 
    "2013-02-20", "2013-03-03")) 
week4(d) # 1 4 5 6 7 9 

2. nextthu

基於在我們看到的天以來,下週四的時代(1970-01-01)(當日有問題,或者如果它已經是週四)的數量是由nextthu第一給出的zoo quickref vignettenextfri功能下面一行。應用這一年的第一天,我們得出的結果,其中d是像以前一樣:

nextthu <- function(d) 7 * ceiling(as.numeric(d)/7) 

week4a <- function(d) (as.numeric(d) - nextthu(jan1(d))) %/% 7 + 1 

,這裏是一個測試

week4a(d) # 1 4 5 6 7 9 

補充:第二個解決方案修正錯誤。