首先要确保您的Date 和Time 变量分别采用日期和时间格式。从您提供的内容中无法判断是这种情况还是这些变量是字符还是因素。
假设它们是字符:
df <- read.table(
text =
"Vehicle.No. Date Time Payment.Amount
SXX0001A 17/08/2019 00:01 1.25
SXX0002A 17/08/2019 00:21 5
SXX0003A 17/08/2019 00:31 0
SXX0004A 17/08/2019 02:01 3
SXX0005A 17/08/2019 03:01 2
SXX0006A 17/08/2019 18:01 1.25
SXX0007A 18/08/2019 00:01 1.25
SXX0008A 18/08/2019 02:01 1.25
SXX0009A 18/08/2019 19:01 1.25
SXX0010A 18/08/2019 20:01 1.25
SXX0006A 20/08/2019 02:01 1.25
SXX0006A 20/08/2019 03:01 3.25
SXX0006A 20/08/2019 01:01 5.25
SXX0006A 20/08/2019 12:01 0
SXX0006A 20/08/2019 14:01 1.25",
stringsAsFactors = F,
header = T
)
str(df$Date)
chr [1:15] "17/08/2019" "17/08/2019" "17/08/2019" "17/08/2019" ...
str(df$Time)
chr [1:15] "00:01" "00:21" "00:31" "02:01" "03:01" "18:01" "00:01" "02:01" ...
让我们以日期和日期时间格式创建 2 个新变量(date 和 datetime)。我正在创建一个datetime 变量而不是time 变量,因为这稍后会派上用场。 readr 包有很好的向量解析功能。
library(dplyr)
library(readr)
df <-
df %>%
mutate(
date = parse_date(Date, "%d/%m/%Y"),
datetime = parse_datetime(paste(Date, Time), "%d/%m/%Y %H:%M")
)
str(df$date)
Date[1:15], format: "2019-08-17" "2019-08-17" "2019-08-17" ...
str(df$datetime)
POSIXct[1:15], format: "2019-08-17 00:01:00" "2019-08-17 00:21:00" ...
我不清楚您希望如何输出(您是要过滤适合您列出的任何时间的数据?还是要分别过滤每个日期和时间段?)。假设您想要所有适合您列出的任何日期和时间段的数据。
由于我们需要过滤几天相同的时间段,我们将使用purrr以避免代码重复:
- 创建一个过滤数据框列表(每个元素对应一个感兴趣的日子)
- 创建一个函数,该函数将过滤某一天所有感兴趣的时间段的数据。该函数使用包
lubridate。
- 由于
purrr:map_df() 将函数应用于列表的每个元素并输出一个数据框并删除我们创建的变量time 和datetime(尽管也许你应该保留它们并摆脱你的@987654336 @ 和 Time 变量)。
library(purrr)
library(lubridate)
ls <- list(
filter(df, date == "2019-08-17"),
filter(df, date == "2019-08-18"),
filter(df, date == "2019-08-19")
)
select_times <- function(df) {
df %>%
filter(
datetime %within% interval(paste(unique(df$date), "06:00:00"),
paste(unique(df$date), "07:00:00")) |
datetime %within% interval(paste(unique(df$date), "08:30:00"),
paste(unique(df$date), "10:00:00")) |
datetime %within% interval(paste(unique(df$date), "12:00:00"),
paste(unique(df$date), "13:00:00")) |
datetime %within% interval(paste(unique(df$date), "17:30:00"),
paste(unique(df$date), "22:00:00"))
)
}
map_df(ls, select_times) %>%
select(- date, - datetime)
输出:
Vehicle.No. Date Time Payment.Amount
1 SXX0006A 17/08/2019 18:01 1.25
2 SXX0009A 18/08/2019 19:01 1.25
3 SXX0010A 18/08/2019 20:01 1.25
这是您感兴趣的日期中感兴趣的时间段的数据子集。
对于替代解决方案,您可能需要查看包xts。 This post 可能很有用。