具有单位的POSIXct的差异,例如difftime

时间:2016-11-07 16:52:49

标签: r apply difftime

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

一样

e.g:

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 - 函数来获得类似于diff的模拟行为。

1 个答案:

答案 0 :(得分: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 

您可以将其打包为一个功能。我不确定这是不是&#34;对&#34;关于我如何处理类和属性的方式,我有兴趣知道是否有更好的方法来做到这一点:

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