Настраиваемый временной интервал в R

#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))