3

漁業データは、多くの場合、毎年 1 月 1 日から始まる統計週ごとに収集されます。2 週目は、毎年次の日曜日から始まります。

2013 年は 1 月 1 日から 1 月 5 日までが第 1 週、1 月 6 日から 1 月 12 日までが第 2 週でした。数年の日付が与えられた静的な週を計算しようとしています。私のデータは dmy 形式 (つまり 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
4

2 に答える 2

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

注:年の最初の日曜日は、第 1 週の開始として定義されます%U。つまり、年が日曜日に開始しない場合、最初の週が第 0 週ではなく第 1 週になるように、週に 1 を追加する必要があります ufmt(cut(d, "year"))dの年が日曜日に始まる場合は 1、それ以外の場合は 0 であるため、上記の式はufmt(d)d の年が日曜日に始まる場合とそうでufmt(d)+1ない場合に縮小されます。

更新: 2006 年のように、年が日曜日から始まる場合でも、1 月が第 1 週から始まるように修正。

于 2013-06-25T00:58:47.830 に答える
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

于 2013-06-25T04:44:00.723 に答える