R 如何将跨小时花费的时间分解为每小时分钟数?

R 如何将跨小时花费的时间分解为每小时分钟数?,r,datetime,google-sheets,time,R,Datetime,Google Sheets,Time,我有一个不同站点的开始和结束时间的源表。我想创建一个新表,显示所有可能的24小时以及每个站点每小时记录的分钟数。将有多个日期和电台,但在本例中,我只包括一个日期和一个电台。如何创建所需的结果(见图),从源中给定的开始和结束时间值开始,小时按分钟细分?在用R复制之前,我试图在Google表单中对其进行概念化 这是一张数据表: 似乎您可以创建一个sql视图来分析第一个表,并以该格式返回您正在查找的信息,而不是尝试将其保存在另一个表中。我最终使用lubridate和purr包在R中找到了一个解决方

我有一个不同站点的开始和结束时间的源表。我想创建一个新表,显示所有可能的24小时以及每个站点每小时记录的分钟数。将有多个日期和电台,但在本例中,我只包括一个日期和一个电台。如何创建所需的结果(见图),从源中给定的开始和结束时间值开始,小时按分钟细分?在用R复制之前,我试图在Google表单中对其进行概念化

这是一张数据表:


似乎您可以创建一个sql视图来分析第一个表,并以该格式返回您正在查找的信息,而不是尝试将其保存在另一个表中。

我最终使用
lubridate
purr
包在R中找到了一个解决方案。它不适用于跨越多天的时间段,例如从晚上11点到凌晨1点的时间段,但适用于单日期分析

df1 <- df0 %>%
  select(station_name, started_time, ended_time) %>%
  mutate(started_time = round_date(ymd_hms(started_time), 'minute'), ended_time = round_date(ymd_hms(ended_time), 'minute')) %>%
  mutate(started_time = as.character(started_time), ended_time = as.character(ended_time)) %>%
  mutate(hour = (purrr::map2(hour(started_time), hour(ended_time), seq, by = 1)), started_date = date(started_time)) %>%
  tidyr::unnest(hour)  %>%
  mutate(minu=case_when(hour(started_time)!=hour & hour(ended_time)==hour ~ 1*minute(ended_time),
                        hour(started_time)==hour & hour(ended_time)!=hour ~ 60-minute(started_time),
                        hour(started_time)==hour & hour(ended_time)==hour ~ 1*minute(ended_time)-1*minute(started_time),
                        TRUE ~ 60)) %>%
  group_by(station_name, started_date, hour) %>%
  summarise(sum(minu))
df1%
选择(站点名称、开始时间、结束时间)%>%
变异(开始时间=轮日(开始时间),“分钟”),结束时间=轮日(结束时间),“分钟”)%>%
变异(开始时间=as.character(开始时间),结束时间=as.character(结束时间))%>%
变异(小时=(purrr::map2(小时(开始时间),小时(结束时间),顺序,由=1),开始日期=日期(开始时间))%>%
三年:最晚(小时)%%>%
变异(分钟=案例时间(小时(开始时间)!=小时和小时(结束时间)=小时~1*分钟(结束时间),
小时(开始时间)=小时和小时(结束时间)!=小时~60分钟(开始时间),
小时(开始时间)=小时和小时(结束时间)=小时~1*分钟(结束时间)-1*分钟(开始时间),
正确~60))%>%
分组依据(站点名称、开始日期、小时)%>%
总结(总和(分钟))

Ok添加到帖子中,这里是:Hello there@benjamin!在考虑了您的问题后,我建议您创建一个以编程方式创建所需结果的应用程序。在您的环境中,这是一个有效的解决方案吗?谢谢,我最终用lubridate和Purr软件包在R中完成了这项工作恭喜@benjamin,这真是令人印象深刻。你能给出一个描述你是如何做到这一点的答案吗?@Jacques GuzelHeron感谢你的轻推!我不知道我是否理解,但我想创建第二个表,因为我想可视化一天中所有可能的时间,即站点登录的时间
df1 <- df0 %>%
  select(station_name, started_time, ended_time) %>%
  mutate(started_time = round_date(ymd_hms(started_time), 'minute'), ended_time = round_date(ymd_hms(ended_time), 'minute')) %>%
  mutate(started_time = as.character(started_time), ended_time = as.character(ended_time)) %>%
  mutate(hour = (purrr::map2(hour(started_time), hour(ended_time), seq, by = 1)), started_date = date(started_time)) %>%
  tidyr::unnest(hour)  %>%
  mutate(minu=case_when(hour(started_time)!=hour & hour(ended_time)==hour ~ 1*minute(ended_time),
                        hour(started_time)==hour & hour(ended_time)!=hour ~ 60-minute(started_time),
                        hour(started_time)==hour & hour(ended_time)==hour ~ 1*minute(ended_time)-1*minute(started_time),
                        TRUE ~ 60)) %>%
  group_by(station_name, started_date, hour) %>%
  summarise(sum(minu))