【问题标题】:Calculating Time Differences using xts in R在 R 中使用 xts 计算时差
【发布时间】:2017-12-17 14:35:31
【问题描述】:

我想知道是否有一种方法可以使用 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") 来计算时间差来尝试更“直截了当”的路线,但这会产生错误,老实说,我不确定为什么。 ..

【问题讨论】:

  • 函数应该是as.POSIXct("16:00:00", format = "%H:%M:%S")as.POSIXct() 将返回日期、时间和时区。如“2017-07-12 16:00:00 CDT”
  • 您可能会查看 lubridate 包,但我不知道它是否处理小数秒。
  • @Kevin Ah 谢谢!是的,实际上我几天前查看了 lubridate 包,但我不能使用它(至少据我所知),因为我使用的是xts

标签: r time xts


【解决方案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 参数出现在... 之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多