我想知道是否有办法使用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")
来计算时间差来尝试更“直截了当”的路线,但是这给出了错误,我老实说不确定为什么...
答案 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
参数出现在...
之后。