Как сделать условие о том, что df1 $ datetime должен быть в течение 30 минут (до и после) от df2 $ datetime - PullRequest
0 голосов
/ 01 апреля 2019

df1 суммирует различные моменты времени в формате "% Y-% m-% d% H:% M:% S". df2 суммирует различные температуры с интервалом в один час (format = "%Y-%m-%d %H"). Я хочу добавить столбец T в df1, но, учитывая, что каждый df2$DateTime является представителем за полчаса до и полчаса спустя. Как пример:

df1<- data.frame(DateTime=c("2016-08-01 08:01:17","2016-08-01 09:17:14","2016-08-01 10:29:31","2016-08-01 11:35:02","2016-08-01 12:22:45","2016-08-01 13:19:27","2016-08-01 14:58:17","2016-08-01 15:30:10"))
df1$DateTime<- as.POSIXct(df1$DateTime, format = "%Y-%m-%d %H:%M:%S", tz= "UTC")

df2<- data.frame(DateTime=c("2016-08-01 06:00:00","2016-08-01 07:00:00","2016-08-01 08:00:00","2016-08-01 09:00:00","2016-08-01 10:00:00","2016-08-01 11:00:00","2016-08-01 12:00:00","2016-08-01 13:00:00","2016-08-01 14:00:00","2016-08-01 15:00:00","2016-08-01 16:00:00"),T = c(21.00, 25.20, 27.0, 27.5, 27.1, 27.0, 26.8, 26.3, 26.0, 26.3, 29.15))
df2$DateTime<- as.POSIXct(df2$DateTime, format = "%Y-%m-%d %H", tz= "UTC")

df1
             DateTime
1 2016-08-01 08:01:17
2 2016-08-01 09:17:14
3 2016-08-01 10:29:31
4 2016-08-01 11:35:02
5 2016-08-01 12:22:45
6 2016-08-01 13:19:27
7 2016-08-01 14:58:17
8 2016-08-01 15:30:10

df2
              DateTime     T
1  2016-08-01 06:00:00 21.00 # This values encompass between 05:30 and 06:30
2  2016-08-01 07:00:00 25.20 # This values encompass between 06:30 and 07:30
3  2016-08-01 08:00:00 27.00 # This values encompass between 07:30 and 08:30
4  2016-08-01 09:00:00 27.50 # This values encompass between 08:30 and 09:30
5  2016-08-01 10:00:00 27.10 # This values encompass between 09:30 and 10:30
6  2016-08-01 11:00:00 27.00 # This values encompass between 10:30 and 11:30
7  2016-08-01 12:00:00 26.80 # This values encompass between 11:30 and 12:30
8  2016-08-01 13:00:00 26.30 # This values encompass between 12:30 and 13:30
9  2016-08-01 14:00:00 26.00 # This values encompass between 13:30 and 16:30
10 2016-08-01 15:00:00 26.30 # This values encompass between 14:30 and 15:30
11 2016-08-01 16:00:00 29.15 # This values encompass between 15:30 and 16:30

Я хотел бы получить это:

df1
             DateTime     T
1 2016-08-01 08:01:17 27.00 # Represented by row 3 in df2
2 2016-08-01 09:17:14 27.50 # Represented by row 4 in df2
3 2016-08-01 10:29:31 27.10 # Represented by row 5 in df2
4 2016-08-01 11:35:02 26.80 # Represented by row 7 in df2
5 2016-08-01 12:22:45 26.80 # Represented by row 7 in df2
6 2016-08-01 13:19:27 26.30 # Represented by row 8 in df2
7 2016-08-01 14:58:17 26.30 # Represented by row 10 in df2
8 2016-08-01 15:30:10 29.15 # Represented by row 11 in df2

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Первый раунд df1 с указанием времени до ближайшего часа, затем используйте merge или inner_join, чтобы получить соответствующую температуру из df2:

library('dplyr')
library('lubridate')
df1 %>% 
  mutate(round_datetime = round_date(DateTime, unit = 'hour')) %>% 
  merge(df2, by.x = 'round_datetime', by.y = 'DateTime') %>% 
  select(-round_datetime)
0 голосов
/ 02 апреля 2019
df1$T <- sapply(df1$DateTime, function(x) {df2$T[df2$DateTime==round(x, "hours")]})
#27.00 27.50 27.10 26.80 26.80 26.30 26.30 29.15

#In case ther is more than one match, take the first one
df1$T <- sapply(df1$DateTime, function(x) {df2$T[df2$DateTime==round(x, "hours")][1]})

#Do it with merge (will break if there are multiple matches)
df1$T <- merge(data.frame(DateTime=round(df1$DateTime, "hours")), df2, all.x=T, sort=F)[2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...