R:如何按小时和分钟过滤时间戳?

时间:2017-01-04 13:35:30

标签: r datetime dplyr lubridate

我正在努力使用以下示例

time = c('2013-01-03 21:59:21.549', '2013-01-04 22:00:21.549', '2013-01-05 22:01:21.222', '2013-01-06 22:06:23.559' )
value = c(1,2,3,4)

data <- data_frame(time, value)
data <-data %>%  mutate(time = ymd_hms(time))

> data
# A tibble: 4 × 2
                 time value
               <dttm> <dbl>
1 2013-01-03 21:59:21     1
2 2013-01-04 22:00:21     2
3 2013-01-05 22:01:21     3
4 2013-01-06 22:06:23     4

我如何撰写dplyr::filter语句,而不是每天在21:5922:01(包括)之间保持观察?

单独使用hour(time)minute(time)进行播放似乎不太适用。

我在这里错过了什么吗?

预期输出:仅限第1,2和3行。 谢谢!

5 个答案:

答案 0 :(得分:2)

您提到hourminute lubridate没有工作,但不确定我明白为什么。这不起作用吗?

filter(data, 
    (hour(time) == 21 & minute(time) == 59) | 
    (hour(time) == 22 & minute(time) <= 1)
)

另一种方法是获取当天经过的秒数,并与对应于所需限制的秒数进行比较。当天经过的秒数计算为以一天中的秒数为模的总秒数:as.numeric(data$time) %% (60 * 60 * 24)。直到(分钟开始)21:59经过的秒数是60 * 60 * 21 + 60 * 59,直到(分钟结束)22:01的秒数是60 * 60 * 22 + 60 + 59。结合一切,

filter(data, between(as.numeric(time) %% (60 * 60 * 24),
                     60 * 60 * 21 + 60 * 59,
                     60 * 60 * 22 + 60 + 59
             )
 )

答案 1 :(得分:1)

我想这可以解决你的问题:

library(dplyr) 

result <- data %>%  
  mutate(time2 = format(time, format="%H:%M:%S")) %>%
  filter(time2 >= "21:59:00" & time2 < "22:02:00") %>%
  select(-time2)

答案 2 :(得分:1)

另一个想法如下。您可以使用小时,分钟和秒创建数字向量。您可以使用format()提取它们并将字符转换为数字。然后,使用表示所需时间范围的两个数字对数据进行子集化(即215900,220100)。

library(dplyr)

data %>%
mutate(foo = as.numeric(format(time, "%H%M%S"))) %>%
filter(between(foo, 215900, 220100)) %>%
select(-foo)

#                 time value
#               <dttm> <dbl>
#1 2013-01-03 21:59:21     1
#2 2013-01-04 22:00:21     2

答案 3 :(得分:0)

2019年在这里! 这是使用print "question", a = raw_input() print "question", b = raw_input() print "question", c = raw_input() print "question", d = raw_input() print "Your answers were: %r, %r, %r and %r" % (a, b, c, d) 的更好(更简单)的解决方案。 as.hms参数是必需的。

tz

会做

    time_str = c('2013-01-03 21:59:21.549', '2013-01-04 22:00:21.549', '2013-01-05 
    22:01:21.222', '2013-01-06 22:06:23.559' )
    value = c(1,2,3,4)
    data <- tibble(time_str, value)

    data %>%  mutate(timestamp_utc = ymd_hms(time_str, tz = 'UTC'),
                     timestamp_est = with_tz(timestamp_utc, 'America/New_York'),
                            time_est = as.hms(timestamp_est, tz = 'America/New_York')) %>% 
      filter(time_est >= hms::as.hms('16:59:00', tz = 'America/New_York'),
             time_est <= hms::as.hms('17:01:00', tz = 'America/New_York'))

答案 4 :(得分:0)

通过将时间戳转换为分钟或秒(时间设置为0000-2400),将其存储在新变量中并使用新变量进行过滤,可以获得另一种过滤时间窗口的方法。