【问题标题】:subsetting in xts using a parameter holding dates使用保存日期的参数在 xts 中进行子集化
【发布时间】:2012-12-15 14:50:47
【问题描述】:

我熟悉 xts 子集化功能。但是,我找不到一个优雅的方法来子集 参数化 日期范围。像这样:

times = c(as.POSIXct("2012-11-03 09:45:00 IST"),
          as.POSIXct("2012-11-05 09:45:00 IST"))

#create an xts object:
xts.obj = xts(c(1,2),order.by = times)

#filter with these dates:
start.date = as.POSIXct("2012-11-03")
end.date = as.POSIXct("2012-11-04")

#instead of xts["2012-11-03"/"2012-11-04"], do something like this:
xts[start.date:end.date]

有人知道吗?谢谢!

【问题讨论】:

    标签: r subset xts


    【解决方案1】:

    您可以将start.dateend.date 对象粘贴在一起,用"::""/" 分隔,然后将其用于子集。

    R> xts.obj[paste(start.date,end.date,sep="::")]
                        [,1]
    2012-11-03 09:45:00    1
    

    【讨论】:

    • 我犹豫要不要放这个,但是当我阅读帮助时,我认为提供基于时间的索引更有效。不是吗?
    • @Joshua:非常感谢! [即使你放的方式,它突然看起来微不足道:-)...]
    • @agstudy:ISO 样式的字符子集按范围(即包含:/ 的长度为1 的向量)非常快。如果您使用 ISO 样式字符 vector. 进行子集化,则速度很慢
    • @JoshuaUlrich:实际上,如果您的 end.date = as.POSIXct("2012-11-05") [而不是 2012-11-4],则使用 sep=":" 返回只有第一个元素。您实际上需要 sep="/"。我应该编辑你的答案吗?
    • @zorbar:哎呀,应该是::
    【解决方案2】:

    [.xts {xts}的帮助下

    由于 xts 使用所有用户级索引的 POSIXct 时间表示 内部类,最快的基于时间的子集总是 从 POSIXct 对象,不管原始的 indexClass 对象。

    所以你可以像这样子集 timeBased :

    xts.obj[seq(start.date,end.date,by=60)]
                        [,1]
    2012-11-03 09:45:00    1
    

    【讨论】:

    • 感谢您的回答。但是, start.date 和 end.date 是 POSIXct 对象。因此,像你写的序列给了我一个以 1 秒为增量的序列。所以,我将它用作 xts.obj[seq(as.Date(start.date),as.Date(end.date),by=1)] 但它给了我一个空列表...
    【解决方案3】:

    对于那些绞尽脑汁为非 Posix 做这件事的人。尤其是基于季度的数据,即 2001 年第二季度至 2006 年第三季度。

    我使用了一个简单而优雅的解决方案:

    library(xts)
    
    starting.quarter<-"200101"
    ending.quarter<-"201702"
    
    oil_price_by_qtr<-oil_price_by_qtr[paste(starting.quarter,ending.quarter,sep="/")]
    

    这会将 XTS 对象从 2001 年第一季度到 2017 年第二季度进行子集化。

    愿这能帮助其他可怜的灵魂避免失去 2 小时的生命。

    【讨论】:

      【解决方案4】:

      我只需要做同样的事情。这是我的解决方案,基于原始示例。

      library(xts)
      
      times = c(as.POSIXct("2012-11-03 09:45:00 IST"),
                as.POSIXct("2012-11-05 09:45:00 IST"))
      
      #create an xts object:
      xts.obj = xts(c(1,2),order.by = times)
      
      #filter with these dates:
      start.date = as.POSIXct("2012-11-03")
      end.date = as.POSIXct("2012-11-04")
      
      # By using an index that is the logical AND of two vectors
      xts.obj[start.date <= index(xts.obj) & index(xts.obj) <= end.date]
      

      【讨论】:

        猜你喜欢
        • 2020-10-29
        • 2017-09-06
        • 2017-07-25
        • 2016-12-27
        • 1970-01-01
        • 2014-02-02
        • 2017-10-11
        • 2018-12-29
        • 1970-01-01
        相关资源
        最近更新 更多