Разделите разницу во времени на отдельные часы

У меня есть data.table, который содержит дату и временные метки для даты начала и окончания. Я знаю, что могу рассчитать разницу во времени, используя функцию difftime. Но я хочу рассчитать разницу во времени и разделить ее на отдельные часы в каждой строке вместе с копией остальных данных. Например:

    Start_time                         End_time 

       1: 2017-01-01 00:15:00 2017-01-01 00:23:00   
       2: 2017-01-01 00:24:00 2017-02-01 00:10:00   
       3: 2017-01-01 23:38:00 2017-02-01 00:45:00  
       4: 2017-01-01 14:38:00 2017-01-01 07:43:00    
       5: 2017-01-01 06:38:00 2017-01-01 00:43:00  

я сделал следующее, чтобы извлечь час начала и час окончания

    Start_time                         End_time             start_hour    end hour

   1: 2017-01-01 00:15:00 2017-01-01 00:23:00         0            0
   2: 2017-01-01 00:24:00 2017-02-01 00:10:00         0            0
   3: 2017-01-01 23:38:00 2017-02-01 00:45:00         23           0
   4: 2017-01-01 14:38:00 2017-01-01 07:43:00         14           7
   5: 2017-01-01 06:38:00 2017-01-01 00:43:00          6           0
now, i have to find all the temperatures between start_hour and end_hour inclusive and populate my table 
i have a weather report which is collected hourly with corresponding temperature, 
 **DateTime**               **Temperature**      hour
1  2017-01-01 06:00:00          16                6
2  2017-01-01 05:00:00          16                5
3  2017-01-01 04:00:00          16                4
4  2017-01-01 08:00:00           9                8
5  2017-01-01 03:00:00           5                3           
6  2017-01-01 00:00:00           8                0
7  2017-01-01 07:00:00           5                7

i have to get all the temperatures between the starttime and end time (inclusive)

ie. if a ride is for 4 hours on a day, 2017-01-01 00:05:00 till 2017-01-01 
04:00:00 i need 4 rows with 4 different temperatures 00:00:00 , 01:00:00, 02:00:00, 03:00:00,04:00:00 . 
date should also be considered here ex: 2017-01-01 23:45:00 till 2017-02-01 14:45:00 ,
 i need 15 rows for corresponding temperature.
 i am struggling with issue and couldnot find a solution,kindly help

person prathyusha    schedule 26.08.2019    source источник
comment
Попробуйте использовать потолок вместо круглого   -  person Pawel Stradowski    schedule 26.08.2019
comment
спасибо, у меня тоже есть потолочная функция usd, но моя проблема не только во времени. Я также хочу разделить разницу в часах на каждый блок отдельных строк с указанием часа. Любая идея о том, как это сделать?   -  person prathyusha    schedule 26.08.2019


Ответы (1)


Я сделал репрекс из ваших данных и использовал data.table для неэквивалентных соединений. Это ваш ожидаемый результат?

library(data.table)

rides <- as.data.table(structure(list(Trip_id = c("17059131", "17059130", "17059129", 
"17059128", "17059127", "17059126", "17059125", "17061379", "17061378", 
"17063646"), DurationInMinutes = c(8, 12, 17, 5, 5, 20, 12, 48, 
47, 25), Start_time = structure(c(1483229700, 1483230240, 1483230480, 
1483231080, 1483231080, 1483231140, 1483231380, 1483232160, 1483232220, 
1483235640), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    End_time = structure(c(1483230180, 1483230960, 1483231500, 
    1483231380, 1483231380, 1483232340, 1483232100, 1483235040, 
    1483235040, 1483237140), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    start_hour = structure(c(1483228800, 1483228800, 1483228800, 
    1483228800, 1483228800, 1483228800, 1483228800, 1483228800, 
    1483228800, 1483232400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    end_hour = structure(c(1483228800, 1483228800, 1483228800, 
    1483228800, 1483228800, 1483228800, 1483228800, 1483232400, 
    1483232400, 1483236000), class = c("POSIXct", "POSIXt"), tzone = "UTC")), class = "data.frame", row.names = c(NA, 
-10L)))

weather <- as.data.table(structure(list(weather_time = structure(c(1483228800, 1483232400, 
1483236000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    temperature = c("9.90", "9.67", "9.33")), class = "data.frame", row.names = c(NA, 
-3L)))

rides_with_temp <- rides[weather, on =.(start_hour <= weather_time, end_hour >= weather_time)] 
rides_with_temp

Код со всеми преобразованиями, если они вам нужны:

library(readxl)
library(lubridate)
library(tidyverse)
library(data.table)

bikerides_startandendtimes <- 
  read_excel("C:/Users/pstra/Downloads/bikerides startandendtimes.xlsx") %>% 
  mutate(Start_time = mdy_hms(Start_time),
         End_time = mdy_hms(End_time),
         start_hour = floor_date(Start_time, unit = "hours"),
         end_hour = floor_date(End_time, unit = "hours")
         ) %>%       
  as.data.table()

weatherdata <- 
  read_excel("C:/Users/pstra/Downloads/weatherdata.xlsx") %>% 
  mutate(weather_time = ymd_h(paste(year, Month, Day, Hour, sep = "/"))) %>% 
  select(weather_time, temperature) %>% 
  as.data.table()

bikerides_startandendtimes[weatherdata, on =.(start_hour <= weather_time, end_hour >= weather_time)] %>%

dput(as.data.frame(head(bikerides_startandendtimes, 10)))
dput(as.data.frame(head(weatherdata, 3)))

С уважением Павел

person Pawel Stradowski    schedule 26.08.2019
comment
спасибо за приведенный выше код, но я думаю, что я не правильно объяснил свой вопрос, я рассчитал разницу во времени и извлек час окончания и час начала, но следующая часть вопроса, - person prathyusha; 26.08.2019
comment
случай 1: если end_date == start_date & end_time == start_time, у меня нет проблем, я могу взять час. но, случай 2: if end_date == start_date & end_time! == start_time, тогда разница в часах должна быть помещена в разные строки: например: если время начала 2017-01-04 13:20:00 время окончания 2017-01-04 16:25:00 он start _ час = 13 end_hour = 16 сейчас, мне нужны блоки по одному часу в разных строках или столбцах 13, 14, 15, 16 часов - person prathyusha; 26.08.2019
comment
случай 3: если end_date == start_date & end_time! == start_time, затем снова часы в разных строках или столбцах вместе с примером разницы дат -: если начало 2017-01-04 13:20:00, а конец 2017-02-04 10:20:00, разница составляет 22 часов, поэтому мне нужно 22 строки с 13 часов с 2017-01 до 10 часов 2017-02. любая помощь, как этого добиться? - person prathyusha; 26.08.2019
comment
Я изменил свой пост выше, это ваш ожидаемый результат? - person Pawel Stradowski; 26.08.2019
comment
Спасибо за ваше время, я получил следующий результат, когда выполнил приведенный выше код, но это не то, что я ищу Start_time End_time time_diff slot 1 2017-01-01 00:15:00 2017-01-01 00:23:00 8 мин. 01.01.2017 00:00:00 2 01.01.2017 00:24:00 01.01.2017 00:36:00 12 мин. 01 13:27:00 2017-01-01 15:20:00 113 минут 2017-01-01 13:00:00 - person prathyusha; 26.08.2019
comment
Я попытаюсь снова отредактировать свой вопрос и опубликовать. это мой первый раз, когда я публикую что-то в stackoverflow. - person prathyusha; 26.08.2019
comment
Пожалуйста, добавьте образец ваших данных, включая температуру. Вы можете сделать это, используя dput: dput(head(your_df,10)) - person Pawel Stradowski; 26.08.2019
comment
две приведенные выше ссылки предназначены для примера данных в Excel, пожалуйста, посмотрите. Спасибо - person prathyusha; 26.08.2019
comment
Есть 2 набора данных, один про температуру, второй про велопрогулки. Скажи мне, какова твоя цель? Пример: я хочу назначить температуру каждой поездки на велосипеде. Отойдите от аналитики и задайте хороший вопрос :-) - person Pawel Stradowski; 27.08.2019
comment
Большое спасибо за ваше понимание. Да, у меня есть два набора данных, мне нужно взять температуру из отчета о погоде в набор данных моего велосипеда за каждый час. Каждая отметка времени начала и окончания ссылается на каждую поездку. Итак, я должен получить информацию о том, как температура меняется от времени начала до времени окончания во время поездки, если продолжительность поездки составляет 3 часа, например: 15.45 - время начала, а 18.45 - время окончания в тот же день, мне нужна температура на 15:00, 16:00, 17:00, 18:00. Если поездка начинается в 23:45 и продолжается до 02:34 утра следующего дня. Затем 23:00, 00:00, 01:00, 02:00 соответствующие температуры r необходимы - person prathyusha; 27.08.2019
comment
И если поездка только на 10 минут и в тот же час того же дня, например: время начала 13:30 и время окончания 13:40 2017-03-01, то температура на 13.00 в этот день. Здесь моя идея подхода заключалась в том, чтобы объединить данные о погоде и данные о велосипеде со столбцом даты и времени в качестве ключа, при условии, что я мог бы разделить разницу между отметками времени начала и окончания на разные отдельные блоки часов, сначала в данных о велосипеде, а затем сопоставить их с Погода. Я надеюсь, что я имел смысл в объяснении моей проблемы. - person prathyusha; 27.08.2019
comment
Всегда предоставляйте воспроизводимый пример (репрекс), на этот раз я сделал его для вас - см. обновленный пост - person Pawel Stradowski; 27.08.2019