将时间戳转换为R中的间隔

时间:2015-12-22 09:15:15

标签: r posixct

考虑样本数据:

>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的逻辑相同。

2 个答案:

答案 0 :(得分:1)

将评论作为答案发布,我们使用cut指定breakslabels作为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)之类的操作。