2013-06-24 56 views
3

漁業數據通常按每年1月1日開始的統計週數收集。第二週從每年的下一個星期天開始。計算統計周,從1月1日開始,用於漁業數據

2013年1月1日至1月5日爲第1周,1月6日至1月12日爲第2周。我試圖計算一個給定日期若干年的靜態星期。我的數據只是d-m-y格式的日期(即16-6-1990),我想要在R代碼中輸出一個統計周。

一個例子是:

> d <- as.Date(c("01-01-2013","06-01-2013","01-01-2006","08-01-2006"),"%d-%m-%Y") 

和所期望的結果將是:

> statweek(d) 
[1] 1 2 1 2 
+0

歡迎來到SO。你應該給[一個可重複的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – agstudy

+0

請使用一個標題,可能有助於未來的搜索者好。你的代碼/答案如何對未來的搜索者有用?如果不能,那麼問題可能會縮小,並可能會被關閉。 –

回答

4

試試這個:

> d <- as.Date("01-01-2013", "%d-%m-%Y") + 0:7 # first 8 days of 2013 
> d 
[1] "2013-01-01" "2013-01-02" "2013-01-03" "2013-01-04" "2013-01-05" 
[6] "2013-01-06" "2013-01-07" "2013-01-08" 
> 
> ufmt <- function(x) as.numeric(format(as.Date(x), "%U")) 
> ufmt(d) - ufmt(cut(d, "year")) + 1 
[1] 1 1 1 1 1 2 2 2 

注:的第一個星期日在今年被定義爲%U這意味着第一週的開始如果年度沒有在星期日開始,那麼我們必須在星期加1,以便第一週是第一週而不是第0周。如果d的年份從星期日開始,則爲ufmt(cut(d, "year")),否則爲零,因此上述公式減少如果星期天開始,則爲ufmt(d),如果不是,則爲ufmt(d)+1

更新:校正使Jan從第1周開始,即使年份在星期天開始,例如, 2006.

+0

+1該死的......我沒有在'strptime'裏讀到足夠多的內容來打''U' - 很好的答案。最簡單的解決方案永遠是最好的。 – thelatemail

+0

@thelatemail你的答案可能並不是最好的,但如果它的工作,並且是合理的,爲什麼不讓它爲其他搜索者爭取他們可以。無論如何,最好的答案會回到頂端,這並沒有什麼不好。 –

+1

@TylerRinker - 我沒有刪除,然後意識到它有問題,並重新調整。它確實讓我想到了一些事情,所以並不是所有的東西都輸了;-) – thelatemail

1

以下是statweek函數。主要參數可以是日期的字符向量(例如,在讀取data.frame之後的默認值)。您可以指定日期的格式(有一個默認:format="%d-%m-%Y"

d1 <- c("01-01-2013","06-01-2013","01-01-2006","08-01-2006") # format="%d-%m-%Y" 
d2 <- c("01/01/2013","06/01/2013","01/01/2006","08/01/2006") # format="%d/%m/%Y" 

statweek = function(dates, format="%d-%m-%Y", ...) { 
    # convert to Date 
    dates = as.Date(dates, format=format, ...) 
    # get correction for the first week of the year (0 if 1-Jan not a Sunday) 
    firstweek = 1 - as.numeric(format(as.Date(cut(dates, "year")), "%U")) 
    output = as.numeric(format(dates, "%U")) + firstweek 
    return(output) 
} 

而且例子:

statweek(d1) 

[1] 1 2 1 2

statweek(d1, format="%d-%m-%Y") 

[1] 1 2 1 2

statweek(d2, format="%d/%m/%Y") 

[1] 1 2 1 2

相關問題