使用Lubridate的week()函数来查找跨多年周期的连续周数

15

在R中,假设我有一组Lubridate日期向量:

> Date
"2012-01-01 UTC"
"2013-01-01 UTC"

接下来,假设我想查看这些日期属于哪一周:

> week(Date)
1
1

Lubridate非常棒!

但是等一下...我正在处理一份有1万行数据的时间序列...而且这些数据跨越了3年。

我一直在苦苦寻找方法,让这成为可能:

> result of awesome R code here
1
54

问题:是否有一种简明的方法可以从Lubridate中推出跨多年期间的周数列表? 更直接地说,我希望第二年的第一周表示为第54周。 第三年的第一周表示为第107周,以此类推。
到目前为止,我尝试了许多方法,但似乎无法创建不使用胶带粘合的东西。非常感谢您提供任何建议。先行致谢。

你想从系列中最小的一年的一月开始生成以周为偏移量吗? - beroe
你想以周为单位计算日期之间的差异,对吗?如果是这样,@beroe的答案似乎是正确的。 - CHP
您提供的解释有所帮助,但并不十分准确。通常年份的最后两天(12月30日和31日)是第53周。12月29日是第52周(在闰年是第53周)。因此,如果您想让来年的1月1日显示为第54周,那么请使用agstudy的答案。如果不需要,则可以使用我的答案上使用trunc()函数获取整数部分即可。 - beroe
4个回答

15

要获取从一个特定日期到另一个日期的时间间隔,你只需要执行减法操作...

如果 tda 是您的日期向量,则

tda - min(tda)

它们之间的差异将以秒为单位计算。

为了将值转换为周:

(tda - min(tda))/eweeks(1)

从特定日期开始执行:

tda - ymd(19960101)

这表示从1996年到每个值的天数。

因此,您可以按每周天数或每周秒数进行除法运算。

(tda - ymd(19960101))/eweeks(1)

为了仅获得整数部分,并从2012年1月开始:

trunc((tda - ymd(20111225))/eweeks(1))

测试数据:

tda = ymd(c(20120101, 20120106, 20130101, 20130108))

输出:

 1  1 53 54

我认为这更接近于OP想要的。 - CHP

6

由于eweeks()现已不再使用,我想补充@beroe的答案。

如果tda是您的日期向量,则可以使用以下方法获取周数:

weeknos <- (interval(min(tda), tda) %/% weeks(1)) + 1

%/% 表示整数除法。(5 / 3 = 1.6675 %/% 3 = 1


那是一个不错的做法。 - beroe

3
您可以像这样做:

您可以这样做:

week(dat) +53*(year(dat)-min(year(dat)))

这也是我的第一反应,但这可能不够健壮。所有年份都有53周吗?第二年开始的几天与第一年的最后一周落在同一周怎么办?等等。 - ialm
1
@ialm 是的,这就是我说“像这样”的原因...我只是在这里提供想法,而不是最终解决方案。 - agstudy

0

假设你喜欢lubridate(我也是)

year_week <- function(x,base) week(x) - week(base) + 52*(year(x) - year(base))
test <- ymd(c(20120101, 20120106, 20130101, 20130108))
year_week(test, "2012-01-01")

给予

[1]  0  0 52 53

刚刚阅读了@agstudy上面的评论,这种方法会有同样的问题 - 并非所有年份都有52周... - Surpdeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接