Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中比较XTS对象中的时间_R_Timestamp_Time Series_Xts - Fatal编程技术网

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

在R中比较XTS对象中的时间,r,timestamp,time-series,xts,R,Timestamp,Time Series,Xts,我想比较date-time列中的时间(这是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"))

我想比较date-time列中的时间(这是
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"))
其中,此函数将从我的数据的第一行索引(即
2007-07-16
)中提取日期。因此,要提取任意行
i
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"))
(格式(索引(My_数据)[1],格式=“%Y-%m-%d”))<
(格式(索引(My_数据)[2],格式=“%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)
结尾的向量



解决方案需要更长时间的原因是转换为字符串的成本很高。我还猜想,对字符串使用逻辑运算符比对数字使用逻辑运算符更昂贵,因为字符串排序取决于您所在地区的排序规则顺序(因此可能会有更多的操作)

谢谢,是的,从外观上看,我最好使用。
.indexDate()
将它们转换为数字,然后使用比较,所以我会尝试:)
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(My_Data, "days")
# [1] 0 3 5