R:如何按小时和分钟过滤时间戳?
R: how to filter a timestamp by hour and minute?
我正在努力处理以下示例
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
除了每天仅保留 21:59
和 22:01
(含)之间的观察值之外,我如何编写 dplyr::filter
语句?
单独玩 hour(time)
和 minute(time)
在这里似乎效果不佳。
我是不是漏掉了什么?
预期输出:仅第 1、2 和 3 行。
谢谢!
我想这可以解决您的问题:
library(dplyr)
result <- data %>%
mutate(time2 = format(time, format="%H:%M:%S")) %>%
filter(time2 >= "21:59:00" & time2 < "22:02:00") %>%
select(-time2)
另一个想法如下。您可以使用小时、分钟和秒来创建数值向量。您可以使用 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
您提到 hour
和 lubridate
中的 minute
不起作用,但不确定我明白为什么。这不行吗?
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
)
)
2019 年来了!
这是使用 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'))
会完成任务
# A tibble: 2 x 5
time_str value timestamp_utc timestamp_est time_est
<chr> <dbl> <dttm> <dttm> <time>
1 2013-01-03 21:59:21.549 1 2013-01-03 21:59:21.549 2013-01-03 16:59:21.549 16:59.549
2 2013-01-04 22:00:21.549 2 2013-01-04 22:00:21.549 2013-01-04 17:00:21.549 17:00.549
另一种过滤时间的方法window可以通过将时间戳转换为分钟或秒(时间设置为 0000 - 2400),将其存储在新变量中并使用新变量进行过滤。
我正在努力处理以下示例
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
除了每天仅保留 21:59
和 22:01
(含)之间的观察值之外,我如何编写 dplyr::filter
语句?
单独玩 hour(time)
和 minute(time)
在这里似乎效果不佳。
我是不是漏掉了什么?
预期输出:仅第 1、2 和 3 行。 谢谢!
我想这可以解决您的问题:
library(dplyr)
result <- data %>%
mutate(time2 = format(time, format="%H:%M:%S")) %>%
filter(time2 >= "21:59:00" & time2 < "22:02:00") %>%
select(-time2)
另一个想法如下。您可以使用小时、分钟和秒来创建数值向量。您可以使用 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
您提到 hour
和 lubridate
中的 minute
不起作用,但不确定我明白为什么。这不行吗?
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
)
)
2019 年来了!
这是使用 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'))
会完成任务
# A tibble: 2 x 5
time_str value timestamp_utc timestamp_est time_est
<chr> <dbl> <dttm> <dttm> <time>
1 2013-01-03 21:59:21.549 1 2013-01-03 21:59:21.549 2013-01-03 16:59:21.549 16:59.549
2 2013-01-04 22:00:21.549 2 2013-01-04 22:00:21.549 2013-01-04 17:00:21.549 17:00.549
另一种过滤时间的方法window可以通过将时间戳转换为分钟或秒(时间设置为 0000 - 2400),将其存储在新变量中并使用新变量进行过滤。