在一列时间戳上使用 difftime 计算 运行 时间差
Calulcate running difference of time using difftime on one column of timestamps
如何计算连续两行时间戳的时间差(以分钟为单位)并将结果添加到新列中。
我试过这个:
data$hours <- as.numeric(floor(difftime(timestamps(data), (timestamps(data)[1]), units="mins")))
但只能从时间零开始获得差异。
已添加示例数据 '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
您与 [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"))
这段代码的作用是:
- 设置数据框,使
timestamps
和 mins
的长度保持相同。
- 在该数据框中,输入您拥有的时间戳以及您还没有任何分钟的事实(即
NA
)。
- Select 除时间戳的第一个元素外的所有元素
mytimes$timestamps[-1]
- Select 除时间戳的最后一个元素外的所有元素
mytimes$timestamps[-nrow(mytimes)]
- 以分钟为单位减去它们
difftime
(因为它们格式正确,您不必先将它们设为 POSIXct 对象)。 units="mins"
- 将 NA 放在前面,因为你的差异比你的行数少
c(NA, ...)
- 将所有这些放回到原始数据框的 mins 列中
mytimes$mins <-
另一种选择是用这种方法计算它:
# 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
如何计算连续两行时间戳的时间差(以分钟为单位)并将结果添加到新列中。
我试过这个:
data$hours <- as.numeric(floor(difftime(timestamps(data), (timestamps(data)[1]), units="mins")))
但只能从时间零开始获得差异。
已添加示例数据 '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
您与 [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"))
这段代码的作用是:
- 设置数据框,使
timestamps
和mins
的长度保持相同。 - 在该数据框中,输入您拥有的时间戳以及您还没有任何分钟的事实(即
NA
)。 - Select 除时间戳的第一个元素外的所有元素
mytimes$timestamps[-1]
- Select 除时间戳的最后一个元素外的所有元素
mytimes$timestamps[-nrow(mytimes)]
- 以分钟为单位减去它们
difftime
(因为它们格式正确,您不必先将它们设为 POSIXct 对象)。units="mins"
- 将 NA 放在前面,因为你的差异比你的行数少
c(NA, ...)
- 将所有这些放回到原始数据框的 mins 列中
mytimes$mins <-
另一种选择是用这种方法计算它:
# 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