tidyverse 是不是提供基于 xts 范围的查询?
Posted
技术标签:
【中文标题】tidyverse 是不是提供基于 xts 范围的查询?【英文标题】:Does tidyverse offer xts range-based queries?tidyverse 是否提供基于 xts 范围的查询? 【发布时间】:2021-09-20 09:58:44 【问题描述】:xts 允许像 willsh["1979-12-31/2017-12-31"]
这样的基于范围的自然时间查询
tidyverse 是否提供类似的功能?
【问题讨论】:
【参考方案1】:lubridate 有间隔类。其中任何一个都可以用来表示从 1979-12-31 到 2017-12-31 的时间间隔。
library(dplyr)
library(lubridate)
ival1 <- interval("19791231/20171231")
ival1a <- interval("1979-12-31/2017-12-31")
ival2 <- interval("19791231/P38Y")
ival2a <- interval("1979-12-31/P38Y")
ival3 <- interval(ymd(19791231), ymd(20171231))
ival3a <- interval(ymd("1979-12-31"), ymd("2017-12-31"))
sapply(list(ival1, ival1a, ival2, ival2a, ival3, ival3a), identical, ival1)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE
%within%
可用于检查日期是否在区间内。
ymd(c(19791230, 19791231, 19800101, 20171230, 20171231, 20180101)) %within% ival1
## [1] FALSE TRUE TRUE TRUE TRUE FALSE
我们可以这样使用它:
# test input
willsh <- tibble(Date = seq(ymd(19700101), ymd(20210101), by = "10 year"),
year = year(Date))
willsh %>% filter(Date %within% interval("1979-12-31/2017-12-31"))
## # A tibble: 4 x 2
## Date year
## <date> <dbl>
## 1 1980-01-01 1980
## 2 1990-01-01 1990
## 3 2000-01-01 2000
## 4 2010-01-01 2010
【讨论】:
接受这一点,因为它最接近 xts 语法,@ronak-shah。谢谢 G. Grothendieck【参考方案2】:No dplyr
或 tidyverse
没有这样的语法。你可以使用filter
like
library(dplyr)
willsh %>%
filter(Date >= as.Date("1979-12-31"), Date <= as.Date("2017-12-31"))
或者使用between
:
willsh %>%
filter(between(Date, as.Date("1979-12-31"), as.Date("2017-12-31")))
【讨论】:
这就是我用的。【参考方案3】:我们可以使用
library(data.table)
setDT(willsh)[between(Date, as.IDate("1979-12-31"), as.IDate("2017-12-31"))]
【讨论】:
以上是关于tidyverse 是不是提供基于 xts 范围的查询?的主要内容,如果未能解决你的问题,请参考以下文章
xts 函数不将我的 POSIXct 日期视为适当的基于时间的对象
xts 函数不将我的 POSIXct 日期视为适当的基于时间的对象