【问题标题】:Continuous week transition over years多年来连续周过渡
【发布时间】:2015-04-22 14:34:35
【问题描述】:

我正在尝试使用 as.Date 计算相对于任何 origin 或基准日期的周偏移量。例如:

bd = as.Date("2013-12-29")
ad1 = as.Date("2014-01-01")
ad1w = as.numeric(strftime(ad1, format = "%W"))
ad2 = as.Date("2015-04-20")
ad2w = as.numeric(strftime(ad2, format = "%W"))

提供:ad1w = 0ad2w = 16。我希望 ad1wad2w 不是 0 和 16,而是偏移到 bd 的数字。是否可以?来源可以是任何日期。谢谢!

澄清一点。比方说:

bd = as.Date("2013-12-25")
ad1 = as.Date("2015-01-07")
ad2 = as.Date("2015-01-06")

bd 是 2013 年的第 51 周,ad1ad2 都是 2015 年的第 1 周。两个偏移量都应该是 54 周,没有四舍五入。

【问题讨论】:

  • 您希望ad1wad2w 上面的情况是什么?
  • 0 和 52+16=68。注意 - 数字不得硬编码,因为 bd 可以是距离 adX 的任意年/月数

标签: r as.date


【解决方案1】:

这就够了吗?

ad1w <- as.numeric(floor((ad1 - bd) /7))
ad2w <- as.numeric(floor((ad2 - bd) /7))

更新

使用lubridate你可以使用:

library(lubridate)

ad1w <- as.numeric(floor((ad1-lubridate::wday(ad1) - (bd-lubridate::wday(bd))) /7))
ad2w <- as.numeric(floor((ad2-lubridate::wday(ad2) - (bd-lubridate::wday(bd))) /7))

逻辑如下。将每个日期重新编码为上一周的最后一个日期,然后使用as.numeric(floor((recoded_ad1 - recoded_bd) /7))

【讨论】:

  • 谢谢。这对我来说是一个几乎可行的解决方案。但是,我想知道是否可以保持date 格式。例如。如果日期是“2015-01-07”和“2015-01-06”,difftime(ad1,ad2,units=weeks) = 0.14
  • Hmm.. 这给出了错误的结果:bd = as.Date("2013-12-28"); ad1 = as.Date("2015-01-07"); ad2 = as.Date("2015-01-06") 结果在54 53 虽然它应该是相同的。我的意思是,在数学上它是正确的,但出于应用的目的 - 第二个示例中的 ad1 和 ad2 周都必须是 53(因为它们都属于 2015 年的第 1 周)
  • 请看我对原始问题的编辑。使用 floor 它为 2015-01-28 的 bd 提供不同的偏移量
  • aaah 好的,所以您希望一周从星期一开始,而不是从星期日开始。只需添加(lubridate::wday(bd)==1)*1 并减去(lubridate::wday(ad1)==1)*1 到最后的ad1w
  • 谢谢!现在适用于我的规格。 (我想知道我是否可以对答案加倍投票?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2021-12-22
  • 2023-03-10
相关资源
最近更新 更多