从R中的POSIXt中提取周数

时间:2015-05-25 00:34:56

标签: r

我有一个简单的问题。我想要做的是在R中提取我的POSIXt日期中的周数。假设我有以下数据

set.seed(123)
tseq <- Sys.time() + cumsum(runif(1000)*86400)
min(tseq)
> [1] "2015-05-25 02:09:24 PDT"

我想确保这组日期中的最小值为0,并且此后的所有其他日期根据此最小值按周编号。我们需要考虑这样一个事实,即最短日期可能是一年,最长日期可能是另一年。

注意:在我的示例中,我在日期之间保持不变的间隔,但在我的实际数据中,日期是随机的。

1 个答案:

答案 0 :(得分:2)

你几乎拥有它 - 只需转向POSIXlt并提取'yearday',当除以7时,得到周数:

R> now <- Sys.time() 
R> tseq <- seq(now, length.out = 100, by = "days") 
R> weeknum <- as.POSIXlt(tseq)$yday/7
R> head(weeknum)
[1] 20.4286 20.5714 20.7143 20.8571 21.0000 21.1429
R> 

你可以舍入或截断为整数,并弄清楚如何处理第一个不完整的一周与第一个完整的一周等。

now 作为基线:

R> head(weeknum - weeknum[1], 10)
 [1] 0.000000 0.142857 0.285714 0.428571 0.571429 0.714286 0.857143 \
     1.000000 1.142857 1.285714
R> head(round(weeknum - weeknum[1]), 10)
 [1] 0 0 0 0 1 1 1 1 1 1
R> head(trunc(weeknum - weeknum[1]), 10)
 [1] 0 0 0 0 0 0 0 1 1 1
R> 

这是一个'随机'日期序列:

R> tseq <- Sys.time() + cumsum(runif(30)*86400)
R> weeknum <- as.POSIXlt(tseq)$yday/7
R> head(round(weeknum - weeknum[1]), 15)
 [1] 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
R> head(trunc(weeknum - weeknum[1]), 15)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
R> 

其中

R> head(difftime(tseq, Sys.time()))
Time differences in hours
[1]  6.08194 17.17697 39.73732 63.21475 66.03445 77.43438
R> 

下一个编辑:

以下是您重新提出的问题的变体:

set.seed(123)
tseq <- Sys.time() + cumsum(runif(10)*86400*2)
as.Date(tseq[1:4])
weeknum <- as.POSIXlt(tseq)$yday/7
head(round(weeknum - weeknum[1]), 10)
head(trunc(weeknum - weeknum[1]), 10)

我得到了:

R> set.seed(123)
R> tseq <- Sys.time() + cumsum(runif(10)*86400*2)
R> as.Date(tseq[1:4])
[1] "2015-05-25" "2015-05-27" "2015-05-28" "2015-05-29"
R> weeknum <- as.POSIXlt(tseq)$yday/7
R> head(round(weeknum - weeknum[1]), 10)
 [1] 0 0 0 1 1 1 1 1 1 2
R> head(trunc(weeknum - weeknum[1]), 10)
 [1] 0 0 0 0 0 0 1 1 1 1
R>