【问题标题】:calculate statistical week, starting 1st January, as used in fisheries data计算从 1 月 1 日开始的统计周,用于渔业数据
【发布时间】:2013-06-24 23:49:27
【问题描述】:

渔业数据通常按每年 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

【问题讨论】:

  • 欢迎来到 SO。你应该给a reproducible example
  • 请使用可能对未来搜索者也有帮助的标题。您的代码/答案如何对未来的搜索者有用?如果不能,那么问题可能会缩小并可能会关闭。

标签: r date


【解决方案1】:

试试这个:

> 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 周。如果 d 的年份从星期日开始,ufmt(cut(d, "year")) 等于 1,否则为零,因此如果 d 的年份从星期日开始,则上面的公式简化为 ufmt(d),如果 ufmt(d)+1不是。

更新:更正所以 Jan 从第 1 周开始,即使年份从星期日开始,例如2006 年。

【讨论】:

  • +1 该死....我在strptime 中阅读的内容还不够远,无法点击%U - 很好的答案。最简单的解决方案总是最好的。
  • @thelatemail 您的回答可能不是最好的,但如果它有效且合理,为什么不让其他搜索者获得他们所能获得的。无论如何,最好的答案都会上升到顶部,这并没有什么坏处。
  • @TylerRinker - 我取消删除,然后意识到它仍然存在问题并重新删除。它确实让我思考了一些事情,所以并不是所有的东西都丢失了;-)
【解决方案2】:

这是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多