0

您将如何计算两行连续时间戳的时间差(以分钟为单位)并将结果添加到新列中。

我试过这个:

data$hours <- as.numeric(floor(difftime(timestamps(data), (timestamps(data)[1]), units="mins")))

但只能从零时间开始获得差异。

添加了我要添加的带有“分钟”列的示例数据

timestamps                        mins
2013-06-23 00:00:00               NA
2013-06-23 01:00:00               60
2013-06-23 02:00:00               60
2013-06-23 04:00:00              120
4

2 回答 2

6

您与 [1] 一起使用的代码始终引用时间戳向量的第一个元素。

要执行您想要的操作,您需要查看除第一个元素之外的所有元素减去除最后一个元素之外的所有元素。

mytimes <- data.frame(timestamps=c("2013-06-23 00:00:00",
                                   "2013-06-23 01:00:00",
                                   "2013-06-23 02:00:00",
                                   "2013-06-23 04:00:00"),
                      mins=NA)
mytimes$mins <- c(NA, difftime(mytimes$timestamps[-1],
                               mytimes$timestamps[-nrow(mytimes)],
                               units="mins"))

这段代码的作用是:

  1. 设置一个数据框,以便您保持和的长度timestamps相同mins
  2. 在该数据框中,放置您拥有的时间戳以及您还没有任何分钟的事实(即NA)。
  3. 选择除时间戳的第一个元素之外的所有元素mytimes$timestamps[-1]
  4. 选择除时间戳的最后一个元素之外的所有元素mytimes$timestamps[-nrow(mytimes)]
  5. 以分钟为单位减去它们difftime(因为它们格式正确,您不必先将它们设为 POSIXct 对象)。units="mins"
  6. 将 NA 放在前面,因为您的差异比行数少c(NA, ...)
  7. 将所有内容放回原始数据框的 mins 列mytimes$mins <-
于 2015-12-17T12:12:00.657 回答
2

另一种选择是用这种方法计算它:

# create some data for an MWE
hrs <- c(0,1,2,4)

df <- data.frame(timestamps = as.POSIXct(paste("2015-12-17", 
                                            paste(hrs, "00", "00", sep = ":"))))

df
# timestamps
# 1 2015-12-17 00:00:00
# 2 2015-12-17 01:00:00
# 3 2015-12-17 02:00:00
# 4 2015-12-17 04:00:00

# create a function that calculates the lag for n periods
lag <- function(x, n) c(rep(NA, n), x[1:(length(x) - n)])

# create a new column named mins
df$mins <- as.numeric(df$timestamps - lag(df$timestamps, 1)) / 60

df
# timestamps mins
# 1 2015-12-17 00:00:00   NA
# 2 2015-12-17 01:00:00   60
# 3 2015-12-17 02:00:00   60
# 4 2015-12-17 04:00:00  120
于 2015-12-17T12:15:36.497 回答