比较 R 中 XTS 对象的时间
Comparing Times in XTS objects in R
我想比较日期时间列(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-16
至 2007-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()
returns 是一个长度小于其输入的观察值的对象,因此您需要将其与前导零或 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()
总是 returns 以 0
开头并以 nrow(x)
结尾的向量。
endpoints(My_Data, "days")
# [1] 0 3 5
您的解决方案耗时较长的原因是转换为字符串的成本很高。我还猜测在字符串上使用逻辑运算符比在数字上使用更昂贵,因为字符串排序取决于您的语言环境的整理顺序(因此可能有更多操作)。
我想比较日期时间列(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-16
至 2007-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()
returns 是一个长度小于其输入的观察值的对象,因此您需要将其与前导零或 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()
总是 returns 以 0
开头并以 nrow(x)
结尾的向量。
endpoints(My_Data, "days")
# [1] 0 3 5
您的解决方案耗时较长的原因是转换为字符串的成本很高。我还猜测在字符串上使用逻辑运算符比在数字上使用更昂贵,因为字符串排序取决于您的语言环境的整理顺序(因此可能有更多操作)。