渔业数据通常按每年1月1日开始的统计周收集。第二周从每年的下一个星期天开始。
因此,2013年1月1日至1月5日是第1周,1月6日至1月12日是第二周。我试图计算一个多年的日期的静态周。我的数据只是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 :(得分: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周的开始,这意味着如果年份没有在星期日开始,那么我们必须将1添加到一周,以便第一周是第1周而不是第0周。ufmt(cut(d, "year"))
等于一,如果d
的年份从星期日开始,否则为零,所以如果年份,上面的公式会减少到ufmt(d)
从星期日开始,如果没有,则ufmt(d)+1
。
更新:更正因此1月1日开始,即使年份在星期日开始,例如2006年。
答案 1 :(得分: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