比较R中的XTS对象中的时间



我想比较日期时间列中的时间(这是xts对象的索引列)。假设我有称为My_Data的数据集如下:

My_Data <- structure(c(5, 2, 4, 8, 9), index = structure(c(1184599268.133, 
  1184602925.231, 1184604481.931, 1184685301.769, 1184685668.133), tzone = "",
  tclass = c("POSIXct", "POSIXt")), class = c("xts", "zoo"), 
  .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"),
  .indexTZ = "", tzone = "", .Dim = c(5L, 1L), .Dimnames = list(NULL, "Price"))

请注意,由于数据是xts对象,因此日期时间列位于数据集的索引中,可以使用函数index(My_Data)

来引用

对于我的程序,我正在通过数据集进行迭代,我想知道何时在数据索引中发生变化(在上面的数据中,将从日期2007-07-162007-07-17)为此,我尝试使用以下功能在每个索引行中提取日期:

(format(index(My_Data)[1], format = "%Y-%m-%d"))

此功能将从我数据的第一行(即2007-07-16)中提取日期。因此,要提取任意行i我使用

(format( index(My_Data)[i], format = "%Y-%m-%d"))

和,要比较两个不同的行以找出我使用的日期是否不同:

(format( index(My_Data)[1], format = "%Y-%m-%d")) <
(format( index(My_Data)[2], format = "%Y-%m-%d"))

将第一个索引行的日期与第二个索引行的日期进行比较。

但是,此比较非常慢 - 我使用microbenchmark软件包检查了此比较,它是毫秒的顺序!由于我有大量数据,所以我想知道是否有一种更有效的方法来检查索引中日期何时更改,因为此方法将使我的代码慢慢降低。

您(至少)有几个更好的选择。选择最适合您的情况的一种。

您可以使用.indexDate()diff()告诉您索引日期何时更改。请记住,diff()返回一个长度的对象,其长度小于其输入,因此您需要将其与领先的零或NA进行连接。

merge(My_Data, newdate = c(0, diff(.indexDate(My_Data))))
#                     Price newdate
# 2007-07-16 10:21:08     5       0
# 2007-07-16 11:22:05     2       0
# 2007-07-16 11:48:01     4       0
# 2007-07-17 10:15:01     8       1
# 2007-07-17 10:21:08     9       0

您也可以使用endpoints()告诉您系列中每一天的最后观察。请记住,endpoints()总是返回以0开头的向量,并以nrow(x)结束。

endpoints(My_Data, "days")
# [1] 0 3 5

您的解决方案需要更长的原因是因为转换为角色字符串很昂贵。我还可以猜测,在字符串上使用逻辑运算符比数字上的数字更昂贵,因为字符串排序取决于您的语言环境的整理顺序(因此可能有更多的操作)。