【问题标题】:issues when trying to make indices unique in xts尝试使索引在 xts 中唯一时的问题
【发布时间】:2013-05-13 21:45:55
【问题描述】:

我有以下 xts 对象:

options("digits.secs" = 1)
ex <- structure(c(NA, -63L, NA, NA, NA, NA, NA, 0L, NA, NA, NA, NA, 
NA, 1L, NA, NA, NA, NA), .Dim = c(6L, 3L), .Dimnames = list(NULL, 
    c("V2", "V3", "V4")), index = structure(c(1366088402.46, 
1366088402.46, 1366088402.463, 1366088402.463, 1366088469.697, 
1366088469.697), tzone = "", tclass = c("POSIXct", "POSIXt")),
class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"),
tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "")
ex <- make.index.unique(ex, drop = TRUE, fromLast = TRUE)

但是,生成的 xts 对象没有唯一索引。我还尝试将strptimeformat="...%OS1" 一起使用,它会为所有值返回NA。上面的代码直观地对我来说没有意义,因为我正在使用输出选项来尝试截断我的日期。

我搜索了其他人如何处理分数时间戳,大多数结果似乎与上述一致。为什么%OS1 不为我工作,options 真的是处理这个问题的正确方法吗?我希望我的时间索引以指定的增量在内部被截断,每次我将 options("digits.secs") 设置为新值时,我的索引都不应该改变。

> options("digits.secs"=3)
> head(ex)
                         V2 V3 V4
2013-04-16 00:00:02.460  NA NA NA
2013-04-16 00:00:02.460 -63  0  1
2013-04-16 00:00:02.463  NA NA NA
2013-04-16 00:00:02.463  NA NA NA
2013-04-16 00:01:09.697  NA NA NA
2013-04-16 00:01:09.697  NA NA NA
> ex <- align.time(ex, n = 0.1)
> head(ex)
                       V2 V3 V4
2013-04-16 00:00:02.5  NA NA NA
2013-04-16 00:00:02.5 -63  0  1
2013-04-16 00:00:02.5  NA NA NA
2013-04-16 00:00:02.5  NA NA NA
2013-04-16 00:01:09.7  NA NA NA
2013-04-16 00:01:09.7  NA NA NA
> ex <- make.index.unique(ex, drop = TRUE, fromLast = TRUE)
> head(ex)
                         V2     V3   V4
2013-04-16 00:00:02.5    NA     NA   NA
2013-04-16 00:01:09.7    NA     NA   NA
2013-04-16 00:01:09.7 -65.5  -7500 0.25
2013-04-16 00:01:13.5 -64.0  -7500 0.25
2013-04-16 00:01:15.4 -64.0 -10000 0.20
2013-04-16 00:01:24.9 -64.0 -10000 0.20

如您所见,我的数据长度已减少到大约三分之一,但即使在前几行中,在 00:01:09.7 也有重复的时间索引。

【问题讨论】:

  • 是什么让您知道结果索引不是唯一的?您是否将它们打印出来并进行视觉比较,您是否使用anyDuplicated(.)length(unique(.))。你的数据是什么样的?如果您发现了其他相关问题,是否值得链接到它们?
  • 请将dput(head(data)) 的输出添加到您的问题中。
  • 不幸的是,这并没有帮助,因为我没有尝试附加小数位来创建更高分辨率的时间戳。我的数据时间戳到最近的 nano,我试图在这里放弃分辨率,现在我想要的只是 1/10 秒,只是为了确认我可以获得唯一的时间戳。 Ricardo,我已经打印到控制台并在视觉上检测到非唯一索引,但是 anyDuplicated(index(data)) 返回 0 和 length(unique(index(data) == length(index(data))。我的数据都是数字的,感谢你们迄今为止的帮助。
  • options("digits.secs") 不会更改索引值。它只会改变它们的显示方式。 make.index.unique(..., drop=TRUE) 只会删除具有完全相同索引值的行。您似乎希望将数据聚合为 0.1 秒的增量,但很难确定,因为您没有提供对象、当前输出和预期输出的可重现示例。

标签: r xts


【解决方案1】:

尝试像这样修改你的格式:

strptime(Sys.time(), format = "%Y-%m-%d %H:%M:%S")

'format = "%Y/%m/%d %H:%M:%S"' 输出为 NA:

strptime(Sys.time(), format = "%Y/%m/%d %H:%M:%S")

【讨论】:

    【解决方案2】:

    您似乎真的想要聚合您的数据,而不仅仅是让索引值唯一。假设您想对每一列求和,这将起作用。如果您不想这样做,只需将另一个功能替换为您想要的每列。

    library(xts)
    ex <- structure(c(NA, -63L, NA, NA, NA, NA, NA, 0L, NA, NA, NA, NA, 
    NA, 1L, NA, NA, NA, NA), .Dim = c(6L, 3L), .Dimnames = list(NULL, 
        c("V2", "V3", "V4")), index = structure(c(1366088402.46, 
    1366088402.46, 1366088402.463, 1366088402.463, 1366088469.697, 
    1366088469.697), tzone = "", tclass = c("POSIXct", "POSIXt")),
    class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"),
    tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "")
    
    options(digits.secs=6)
    
    # endpoints() doesn't support sub-second resolution on Windows,
    # so do what it does using only R code.
    ep <- c(0,which(diff(.index(ex)%/%0.1%/%1+1) != 0),NROW(ex))
    x <- period.apply(ex, ep, colSums, na.rm=TRUE)
    x <- align.time(x, 0.1)
    

    【讨论】:

    • 谢谢,但我不明白为什么只删除重复时间戳序列中除最后一个之外的所有内容是不够的。 make.index.unique 似乎正是我想要做的,只是输出不是我所期望的。您可以从两个 head(data) 调用中看到 2013-04-16 00:00:02.5 的一些条目被删除,但 2013-04-16 00:01:09.7 没有被删除。我尝试从另一个中减去一个 2013-04-16 00:01:09.7 并返回 -0.0999999 秒,所以在内部我的索引不会按照它们的显示方式被截断,即使在 align.time(data, n = 0.1)。
    • @tmakino:好吧,您的“实际”对象仅包含 6 行,因此我无法复制问题……因此重复请求提供可重现的示例。如果人们无法复制您需要帮助的问题,他们很难帮助您。
    • 我理解,而且我也多次未能生成与我的数据一致的示例。我会继续努力,但如果你能提供任何提示,请告诉我。
    • @tmakino:老实说,我不知道也没有时间想象可能导致您描述的问题的情况。
    • 好的,感谢您抽出宝贵时间编辑我的问题。我会发布任何更新,但我会尝试找到一种方法来做到这一点,而无需使用带有小数秒的 align.time。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 2013-03-15
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多