Как извлечь время после определенного времени и перед другим временем в R? - PullRequest
1 голос
/ 07 января 2020

Возможно, мой вопрос задавался раньше. Я искал, но я не мог найти. Спасибо за ваш ответ или со ссылкой на предыдущий пост. У меня есть два набора данных. Мои наборы данных (DF1 и DF2) включают в себя дату, время и значение моих желаемых переменных (V1 и V2). Столбцы «Дата» и «Время» относятся к классу факторов. Вот мой DF1, включая V1:

#DF1
Date        Time         V1
6/2/2019  0:00:00        0
6/2/2019  0:01:00        24
.
..
6/2/2019  23:59:00       56
6/3/2019  0:00:00        78
6/3/2019  0:01:00        24
.
..
6/3/2019  23:59:00       32
6/4/2019  0:00:00        14
6/4/2019  0:01:00        62
.
..
6/4/2019  23:59:00       103

Затем, вот мои данные (DF2), которые включают переменную 2 (V2).

#DF2
Date        Time         V2    
6/2/2019  0:00:00        2
6/2/2019  0:01:00        33
.
..
6/2/2019  23:59:00       12
6/3/2019  0:00:00        14
6/3/2019  0:01:00        56
.
..
6/3/2019  23:59:00       67
6/4/2019  0:00:00        94
6/4/2019  0:01:00        43
.
..
6/4/2019  23:59:00       156

Сначала я должен объединить эти два набора данных на основе переменной DateTime (которая является комбинацией даты и времени). Итак, я использовал следующий код:

# I used the following to change the date class for DF1 and DF2.
DF1$Date <- as.Date(DF1$Date , "%d/%m/%Y")
DF2$Date <- as.Date(DF2$Date , "%d/%m/%Y")

#Then, I merged Date and Time in each dataset in a variable called "Datetime"
DF1$Datetime <- paste(DF1$Date , DF1$Time)
DF2$Datetime <- paste(DF2$Date , DF2$Time)

#Then, I changed the type of Datetime variable as follows:
DF1$Datetime <- as.POSIXct(DF1$Datetime, format = "%Y-%m-%d %H:%M:%S")
DF2$Datetime <- as.POSIXct(DF2$Datetime, format = "%Y-%m-%d %H:%M:%S")

#After that, I merged the datasets DF1 and DF2 by Datetime variable:
My_DF <- merge(DF1, DF2, by = "Datetime")

Теперь мне нужно извлечь подмножество My_DF со временем (записями) после «9:00:00» и до «22:00»: 00" . Например, вывод должен включать в себя, но не ограничиваясь, все записи 9:01:00 за семь дней в моих данных. Итак, я попробовал следующее, но это не работает:

New_DF <- subset(My_DF, My_DF$Time > "09:00:00" & My_DF$Time < "22:00:00")

New_DF (мой желаемый вывод) должен быть следующим:

Date        Time         V1         V2    
6/2/2019  9:01:00        ..         ..
6/3/2019  9:01:00        ..         ..
6/4/2019  9:01:00        ..         ..
6/2/2019  9:02:00        ..         ..
6/3/2019  9:02:00        ..         ..
6/4/2019  9:02:00        ..         ..
..
6/2/2019  21:59:00       ..         ..
6/3/2019  21:59:00       ..         ..
6/3/2019  21:59:00       ..         ..

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Вы можете установить поднабор данных в зависимости от часа дня:

#merge two datasets
New_DF <- merge(transform(df1, 
                datetime = as.POSIXct(paste(Date, Time), format = "%d/%m/%Y %T")), 
                transform(df2, 
                datetime = as.POSIXct(paste(Date, Time), format = "%d/%m/%Y %T")), 
                by = "datetime")
#Select relevant columns
New_DF <- New_DF[c("datetime", "V1", "V2")]
#Extract hour of the day
New_DF$hour <- as.integer(format(New_DF$datetime, "%H"))
#Subset the data based on hour
New_DF[New_DF$hour >= 9 & New_DF$hour < 22, ]

или используя tidyverse и lubridate

library(tidyverse)
library(lubridate)

inner_join(df1 %>%
            unite(Datetime, Date, Time, sep = " ") %>%
            mutate(Datetime = mdy_hms(Datetime)), 
           df2 %>%
            unite(Datetime, Date, Time, sep = " ") %>%
            mutate(Datetime = mdy_hms(Datetime)), by = "Datetime") %>%
 filter(hour(Datetime) >= 9 & hour(Datetime) < 22)
0 голосов
/ 07 января 2020

Вот один из способов сделать это. Пришлось создать некоторые данные, так как они не были предоставлены

> # create data as factors
> dates <- as.factor(paste0('6/', 2:8, '/2019'))
> times <- as.factor(format(as.POSIXct(seq(0, 86400-60, by = 60), 
+                            origin = '1970-1-1',
+                            tz = 'UTC'), 
+                 format = '%H:%M:%S')
+ )
> 
> # create data.frame (tibble)
> tib <- tibble(date = rep(dates, each = 1440),
+               time = rep(times, times = 7)
+ )
> 
> # select data after converting factors to characters
> # (try to avoid the use of factors except for categorical data)
> sel <- filter(tib,
+               as.character(time) >= '10:00:00' &
+                 as.character(time) <= '22:00:00'
+ )
> 
> glimpse(tib)
Observations: 10,080
Variables: 2
$ date <fct> 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6...
$ time <fct> 00:00:00, 00:01:00, 00:02:00, 00:03:00, 00:04:00, 00:05:00, 00:06:00, 00:07:00, 00:08:00, 0...
> glimpse(sel)
Observations: 5,047
Variables: 2
$ date <fct> 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/2019, 6/2/201...
$ time <fct> 10:00:00, 10:01:00, 10:02:00, 10:03:00, 10:04:00, 10:05:00, 10:06:00, 10:07:00, 10:08:00, 10:09:00, 10:10:0...
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...