考虑样本数据:
>data <- data.frame(seq(now, length.out = 100, by = "hours"))
>str(data)
'data.frame': 100 obs. of 1 variable:
$ Time: POSIXct, format: "2015-12-22 14:20:48" "2015-12-22 15:20:48"
期望的输出:
+-----+---------------------+-----+------+------+
| Row | Time | 8hr | 24hr | 48hr |
+-----+---------------------+-----+------+------+
| 1 | 2015-12-22 01:20:48 | 1 | 1 | 1 |
| 2 | 2015-12-22 08:20:48 | 1 | 1 | 1 |
| 3 | 2015-12-22 10:20:48 | 2 | 1 | 1 |
| 4 | 2015-12-22 15:20:48 | 2 | 1 | 1 |
| 5 | 2015-12-22 18:20:48 | 3 | 1 | 1 |
+-----+---------------------+-----+------+------+
目标:创建每个不同时间间隔的3列。 对于8小时间隔:第1-2行是前8小时。下一个时间戳成为下一个间隔的开始,依此类推。 24h和48h的逻辑相同。
答案 0 :(得分:1)
将评论作为答案发布,我们使用cut
指定breaks
和labels
作为FALSE来获取数字索引。
data[c('Hr8', 'Hr24', 'Hr48')] <- lapply(c('8 hour', '24 hour',
'48 hour'), function(x) cut(data$time, breaks=x, labels=FALSE))
答案 1 :(得分:0)
假设你的时间向量是
timevec <- as.POSIXct(c("2015-12-22 1:20:48", "2015-12-22 22:1:40"))
您可以创建一个开始时间变量并计算差异。 注意你可以指定`units =&#34; hours&#34;因此差异以小时计算。
t0 <- as.POSIXct("2015-12-22 0:0:0")
hourdef <- as.numeric(timevec - t0, units = "hours")
hourdef
# 1.346667 22.027778
最后你的8小时变量由
给出ceiling(hourdef / 8)
# 1 3
请注意,您需要在截止点周围小心一些。当时差恰好等于8时,根据您是否希望变量为1或2,您可能需要执行ceiling((hourdef + 1e-9)/8)
之类的操作。