【问题标题】:Comparing Times in XTS objects in R比较 R 中 XTS 对象的时间
【发布时间】:2018-02-28 01:21:02
【问题描述】:

我想比较日期时间列(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包检查了这个比较,它是毫秒级的!由于我有大量数据,我想知道是否有更有效的方法来检查索引中的日期何时发生变化,因为这种方法会大大降低我的代码速度。

【问题讨论】:

    标签: r timestamp time-series xts


    【解决方案1】:

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

    您可以使用.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
    

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

    【讨论】:

    • 谢谢,是的,从外观上看,我最好使用 ..indexDate() 将它们转换为数字,然后使用比较,所以我会尝试 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2011-10-29
    • 2018-05-04
    • 2014-05-26
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多