【问题标题】:Calulcate running difference of time using difftime on one column of timestamps在一列时间戳上使用 difftime 计算运行时间差
【发布时间】:2015-12-17 11:39:09
【问题描述】:

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

我试过这个:

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

【问题讨论】:

  • 我建议您发布一些示例数据以使您的示例可重现。您的代码暗示使用difftime,我在计算差异时会使用它。跨越成对的值将是索引的问题。然后,您可以对结果做任何想做的事情。另请查看this answer,它涉及类似的问题。

标签: r difftime


【解决方案1】:

您与 [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. 设置数据框,使timestampsmins 的长度保持相同。
  2. 在该数据框中,输入您拥有的时间戳以及您还没有任何分钟的事实(即NA)。
  3. 选择除时间戳mytimes$timestamps[-1]的第一个元素之外的所有元素
  4. 选择时间戳mytimes$timestamps[-nrow(mytimes)]的最后一个元素以外的所有元素
  5. 以分钟为单位减去difftime(因为它们的格式很好,您不必先将它们设为POSIXct 对象)。 units="mins"
  6. 在前面放一个 NA,因为你的差异比你的行少一个 c(NA, ...)
  7. 将所有内容放回原始数据框的 mins 列mytimes$mins &lt;-

【讨论】:

    【解决方案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
    

    【讨论】:

    • 谢谢大家。再次。多条路通罗马 :-)
    • 简单易行!解决了我的问题 :) 谢谢大卫。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多