使用R中的xts计算时间差

时间:2017-07-13 01:25:51

标签: r time xts

我想知道是否有办法使用xts包来计算时差,如果可能的话,无需转换时间值等。我有一个xts对象,其时间格式为2010-02-15 13:35:59.123(其中.123是毫秒)。

现在,我想找到一天结束前的毫秒数(即17:00:00)。然而问题是我在执行此操作之前基本上必须对数据进行一些转换(例如使用as.POSIXct),这变得更加复杂,因为我必须在几天内完成,甚至可能不同倍。出于这个原因,我宁愿不必转换“白天结束时间”并将其保留为17:00:00,以便找到当前时间和白天结束之间的毫秒数。只需要一个相当简单的操作,例如17:00:00.000 - 13:35:59.123 = ...

有一种简单的方法可以通过最少的转换来实现这一目标吗?我确定xts有一个我不知道但我在文档中找不到的功能:/

编辑:我忘了提及,我试图通过首先尝试使用函数as.POSIXct(16:00:00, format = "%H:%M:%S")来计算时间差来尝试更“直截了当”的路线,但是这给出了错误,我老实说不确定为什么...

1 个答案:

答案 0 :(得分:1)

您应该可以使用ave().indexDate()和自定义函数的组合来完成此操作。您没有提供可重现的示例,因此这里使用的是xts附带的每日数据。

library(xts)
data(sample_matrix)
x <- as.xts(sample_matrix)
secsRemaining <- function(x) { end(x)-index(x) })
tdiff <- ave(x[,1], as.yearmon(index(x)), FUN = secsRemaining)
tdiff[86:92,]
#               Open
# 2007-03-28  259200
# 2007-03-29  172800
# 2007-03-30   86400
# 2007-03-31       0
# 2007-04-01 2505600
# 2007-04-02 2419200
# 2007-04-03 2332800

在您的情况下,通话将使用.indexDate(x)代替as.yearmon(index(x))

tdiff <- ave(x[,1], .indexDate(x), FUN = secsRemaining)

另请注意,此ave()调用仅适用于1列xts对象。看起来像一个它没有的错误。另请注意,您必须将FUN =ave()一起使用,因为FUN参数出现在...之后。