R 如何从动物园对象中获取特定时间的所有日期?

R 如何从动物园对象中获取特定时间的所有日期?,r,dataframe,zoo,R,Dataframe,Zoo,假设我有一个日期/时间POSIXct的zoo对象作为索引和值: ... val 2006-08-01 10:00:00 1 2006-08-01 10:10:00 2 2006-08-01 10:20:00 3 2006-08-01 10:30:00 4 ... 2006-08-02 10:00:00 5 2006-08-02 10:10:00 6 2006-08-02 10:20:00

假设我有一个日期/时间POSIXct的zoo对象作为索引和值:

...                     val
2006-08-01 10:00:00      1
2006-08-01 10:10:00      2
2006-08-01 10:20:00      3
2006-08-01 10:30:00      4
...
2006-08-02 10:00:00      5
2006-08-02 10:10:00      6
2006-08-02 10:20:00      7
2006-08-02 10:30:00      8
...
这应该很简单,但我想不出如何获得所有日期/时间的列表,比如说时间是上午10:10:00

动物园数据对象示例:

注意:我更喜欢base-R/zoo实现,但其他软件包可能会很感兴趣,可以使用lubridate提取时间组件。这假定秒等于0

library(lubridate)

z[hour(index(z)) == 10 & minute(index(z)) == 10]
您还可以强制使用字符,然后搜索特定时间

z[grep("10:10:00", index(z))]
出于好奇,我运行了一个基准测试。结果可能是由于类型转换,在小数据集上明显不重要

但随着您添加更多标准,速度会减慢。如果添加secondsindexz==0,则lubridate方法基本相同。grep解决方案可能是一条出路

library(microbenchmark)

benchmark <- microbenchmark(
  lubridate = z[hour(index(z)) == 10 & minute(index(z)) == 10],
  grep = z[grep("10:10:00", index(z))]
)
像这样使用grep或grepl。不使用其他软件包

z[grepl("10:10:00", time(z))]
## 2006-08-01 10:10:00 2006-08-02 10:10:00 
##                   2                   6
另一种方法是使用substr或substring:

如果我们知道这些位置,那么另一种可能性就是使用它们:

z[seq(2, length(z), 4)]
## 2006-08-01 10:10:00 2006-08-02 10:10:00 
##                   2                   6
笔记 可复制形式的输入假设如下。下面的代码似乎是复制到问题中的

Lines <- "datetime        val
2006-08-01T10:00:00      1
2006-08-01T10:10:00      2
2006-08-01T10:20:00      3
2006-08-01T10:30:00      4
2006-08-02T10:00:00      5
2006-08-02T10:10:00      6
2006-08-02T10:20:00      7
2006-08-02T10:30:00      8"

library(zoo)
z <- read.zoo(text = Lines, header = TRUE, tz = "", format = "%Y-%m-%dT%T")
我们可以使用base::strftime:

z[strftimez,格式=%H:%M:%S==strftime1000-01-01 10:10:00,格式=%H:%M:%S] > 2006-08-01 10:10:00 2006-08-02 10:10:00 > 2 5
我不想解析出时间字符串,而是说给我所有时间为10:10:00的行哇,太好了!lubridate代码假定数据中的秒数始终为0,而grep代码则不为0。
z[seq(2, length(z), 4)]
## 2006-08-01 10:10:00 2006-08-02 10:10:00 
##                   2                   6
Lines <- "datetime        val
2006-08-01T10:00:00      1
2006-08-01T10:10:00      2
2006-08-01T10:20:00      3
2006-08-01T10:30:00      4
2006-08-02T10:00:00      5
2006-08-02T10:10:00      6
2006-08-02T10:20:00      7
2006-08-02T10:30:00      8"

library(zoo)
z <- read.zoo(text = Lines, header = TRUE, tz = "", format = "%Y-%m-%dT%T")