2

我有一个 POSIXct 数据的向量,并且想要计算连续元素之间的差异,就像它是由diff

例如:

burst <- as.POSIXct(c("2016-11-07 17:20:52","2016-11-07 16:21:52", "2016-11-07 15:21:52", "2016-11-02 17:20:52","2016-11-02 16:21:52", "2016-11-02 15:21:52"))

conti <- as.POSIXct(c("2016-11-07 17:20:52","2016-11-06 17:20:52", "2016-11-05 17:20:52", "2016-11-04 17:20:52","2016-11-03 17:20:52", "2016-11-02 17:20:52"))

diff(burst)
diff(conti)

我的问题是,单位不相等。我记得difftime有一个调用参数的函数,unit但我无法构造一个apply-function 来获得类似 in 的行为diff

4

1 回答 1

0

我不确定是否有办法diff对 POSIXt 对象强制执行特定的单位。如果没有,您可以直接使用数值,然后设置类和单位属性,以便您仍然拥有一个difftime具有单位属性的对象。

例如,要在分钟内获得差异:

burst.diff = diff(as.numeric(burst))/60
burst.diff = as.difftime(burst.diff, units="mins")

burst.diff
Time differences in mins
[1]   -59   -60 -7141   -59   -60

如果您不关心维护对象类或单元,那么您可以这样做:

burst.diff = diff(as.numeric(burst))/60 

你可以把它打包成一个函数。我不确定这是否是我处理类和属性的“正确”方式,我很想知道是否有更好的方法来做到这一点:

my_difftime = function(x, units="mins") {

  div = c("secs"=1, "mins"=60, "hours"=3600)

  if(is.na(match(units, names(div)))) {
    stop('Please specify either units as either "secs", "mins", or "hours"')
  } else {
    x = diff(as.numeric(x))/div[match(units, names(div))]
    as.difftime(x, units=units) 
  }
}

lapply(list(burst=burst, conti=conti), my_difftime, units="hours")
$burst
Time differences in hours
[1]   -0.9833333   -1.0000000 -119.0166667   -0.9833333   -1.0000000

$conti
Time differences in hours
[1] -24 -25 -24 -24 -24
于 2016-11-07T17:19:24.527 回答