Подмножество данных на основе времени в R - PullRequest
1 голос
/ 30 октября 2019

У меня есть набор данных о трафике, в котором есть столбцы даты и времени, однако у меня возникают проблемы с правильной настройкой данных в соответствии с определенным временем. Есть ли способ правильно установить данные на основе диапазонов даты и времени? Использование фильтра или подмножества, кажется, не работает для меня.

Например, я хотел бы извлечь данные из 17/08/2019 до 19/08/2019 и для следующих периодов времени: 06:00 до 07:00, 08:30 до 10:00, 12:00 до 13:00, 17:30 до 19:00, 19:00 до 20:00 и 20:00 до 22:00. Я ценю все советы, пожалуйста!

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

1 Ответ

1 голос
/ 30 октября 2019

Прежде всего убедитесь, что переменные 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, чтобы избежатьповторение кода:

  1. создать список отфильтрованных фреймов данных (каждый элемент соответствует одному из дней интереса)
  2. создать функцию, которая будет фильтровать данные за все периоды времениИнтерес на определенный день. Эта функция использует пакет lubridate.
  3. , применяет функцию к каждому элементу списка и выводит фрейм данных благодаря purrr:map_df() и удаляет созданные нами переменные time и datetime (хотявозможно, вам следует оставить их и избавиться от переменных Date и 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. Этот пост может быть полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...