首页 > 解决方案 > 如何从动物园对象中获取特定时间的所有日期?

问题描述

假设我有一个日期/时间 (POSIXct) 的动物园对象作为我的索引和值:

...                     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 ...


示例动物园数据对象:

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

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

注意:我更喜欢 base-R/zoo 实现,但其他包会很有趣

标签: rdataframezoo

解决方案


一种方法是用来lubridate提取时间分量。这假设second()等于 0。

library(lubridate)

z[hour(index(z)) == 10 & minute(index(z)) == 10]

您也可以强制转换为字符,然后搜索特定时间。

z[grep("10:10:00", index(z))]

出于好奇,我运行了一个基准测试。结果可能是由于类型转换,在小数据集上显然是微不足道的。

基准

但是,随着您添加更多标准,它会变慢。如果加进去seconds(index(z)) == 0lubridate方法基本一样。grep解决方案可能是要走的路。

library(microbenchmark)

benchmark <- microbenchmark(
  lubridate = z[hour(index(z)) == 10 & minute(index(z)) == 10],
  grep = z[grep("10:10:00", index(z))]
)

推荐阅读