#r #datetime
#r #datetime
Вопрос:
У меня есть данные в следующем формате
Date Hour Column01 Column02
2020-05-01 00 Value01 Value02
2020-05-01 01 Value01 Value02
2020-05-01 02 Value01 Value02
2020-05-01 03 Value01 Value02
2020-05-01 13 Value01 Value02
2020-05-01 14 Value01 Value02
2020-05-01 15 Value01 Value02
2020-05-01 16 Value01 Value02
2020-05-01 17 Value01 Value02
2020-05-01 18 Value01 Value02
2020-05-01 19 Value01 Value02
2020-05-01 20 Value01 Value02
2020-05-01 21 Value01 Value02
2020-05-01 22 Value01 Value02
2020-05-01 23 Value01 Value02
2020-05-02 00 Value01 Value02
2020-05-02 01 Value01 Value02
2020-05-02 02 Value01 Value02
2020-05-02 03 Value01 Value02
2020-05-02 13 Value01 Value02
2020-05-02 14 Value01 Value02
Есть ли способ выбрать приведенные ниже записи для каждого дня? Итак, для 2020-05-01 время начинается с часа 13 в 2020-05-01 и заканчивается в час 03 в 2020-05-02.
Date Hour Column01 Column02
2020-05-01 13 Value01 Value02
2020-05-01 14 Value01 Value02
2020-05-01 15 Value01 Value02
2020-05-01 16 Value01 Value02
2020-05-01 17 Value01 Value02
2020-05-01 18 Value01 Value02
2020-05-01 19 Value01 Value02
2020-05-01 20 Value01 Value02
2020-05-01 21 Value01 Value02
2020-05-01 22 Value01 Value02
2020-05-01 23 Value01 Value02
2020-05-02 00 Value01 Value02
2020-05-02 01 Value01 Value02
2020-05-02 02 Value01 Value02
2020-05-02 03 Value01 Value02
Есть мысли?
Комментарии:
1. В ожидаемой последней строке — час 03, который не найден в вашем вводе для ‘2020-05-02
2. Добавил его. В зависимости от способа записи данные не всегда могут иметь запись для каждого часа. Независимо от того, я должен иметь возможность выбрать интервал от 1300 часов в день 01 до 0300 часов в день 02.
3. Вы можете проверить мое решение ниже обновлено
Ответ №1:
Мы можем использовать subset
in base R
. Мы предполагаем, что подмножество ‘Hour’ предназначено только для ‘Date’ 2020-05-01′
subset(df1, (Date == '2020-05-01' amp; Hour >=13)|(Date == '2020-05-02' amp; Hour <= 3))
# Date Hour Column01 Column02
#5 2020-05-01 13 Value01 Value02
#6 2020-05-01 14 Value01 Value02
#7 2020-05-01 15 Value01 Value02
#8 2020-05-01 16 Value01 Value02
#9 2020-05-01 17 Value01 Value02
#10 2020-05-01 18 Value01 Value02
#11 2020-05-01 19 Value01 Value02
#12 2020-05-01 20 Value01 Value02
#13 2020-05-01 21 Value01 Value02
#14 2020-05-01 22 Value01 Value02
#15 2020-05-01 23 Value01 Value02
#16 2020-05-02 0 Value01 Value02
#17 2020-05-02 1 Value01 Value02
#18 2020-05-02 2 Value01 Value02
#19 2020-05-02 3 Value01 Value02
данные
df1 <- structure(list(Date = c("2020-05-01", "2020-05-01", "2020-05-01",
"2020-05-01", "2020-05-01", "2020-05-01", "2020-05-01", "2020-05-01",
"2020-05-01", "2020-05-01", "2020-05-01", "2020-05-01", "2020-05-01",
"2020-05-01", "2020-05-01", "2020-05-02", "2020-05-02", "2020-05-02",
"2020-05-02", "2020-05-02", "2020-05-02"), Hour = c(0L, 1L, 2L,
3L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 0L,
1L, 2L, 3L, 13L, 14L), Column01 = c("Value01", "Value01", "Value01",
"Value01", "Value01", "Value01", "Value01", "Value01", "Value01",
"Value01", "Value01", "Value01", "Value01", "Value01", "Value01",
"Value01", "Value01", "Value01", "Value01", "Value01", "Value01"
), Column02 = c("Value02", "Value02", "Value02", "Value02", "Value02",
"Value02", "Value02", "Value02", "Value02", "Value02", "Value02",
"Value02", "Value02", "Value02", "Value02", "Value02", "Value02",
"Value02", "Value02", "Value02", "Value02")), class = "data.frame",
row.names = c(NA,
-21L))
Комментарии:
1. Спасибо. Я использовал subset для создания двух временных фреймов данных. Один для часов 13 и выше, а второй для часов 3 и ниже. Для второго фрейма данных я уменьшил дату на единицу и использовал rbind для объединения обоих.
2. В качестве альтернативы, я могу добавить 5 часов к моей исходной временной метке, и это также должно ее исправить. Но спасибо за быстрый ответ akrun
Ответ №2:
В качестве альтернативы решению akrun, вот версия dplyr:
library(dplyr)
df1 %>%
filter((Date == "2020-05-01" amp; Hour >=13)
| (Date == "2020-05-02" amp; Hour <= 3))