首页 > 解决方案 > 如何用数据帧中两次之间的时间填充数据帧?

问题描述

我正在尝试用“Start_dates”和“End_dates”之间的日期和时间填充我的数据框,它们都位于数据框的不同列中。我想每分钟做一次。

例如,我有一个这样的数据框:

data <- data.frame(id = c(1,1,1,2,3),
                   Start_dates = c("20-10-2016 00:00:00", "23-10-2016 00:00:00", "01-03-2018 00:00:00", "05-12-2018 00:00:00", "02-04-2016 00:00:00"),
                   End_dates = c("20-10-2016 00:02:00", "23-10-2016 00:01:00", "01-03-2018 00:01:00", "05-12-2018 00:02:00", "02-04-2016 00:01:00"))

我想得到这样的东西:

     data_requested <- data.frame(id = c(1,1,1,1,1,1,1,2,2,3,3,3), 
      times = c("20-10-2016 00:00:00",
      "20-10-2016 00:01:00", "20-10-2016 00:02:00", "23-10-2016 00:00:00",
     "23-10-2016 00:01:00", "01-03-2018 00:00:00", "01-03-2018 00:01:00", 
     "05-12-2018 00:00:00", "05-12-2018 00:01:00", "05-12-2018 00:02:00", 
     "02-04-2016 00:00:00", "02-04-2016 00:01:00"))

我尝试了很多东西,但它给了我一个错误或者不是我正在寻找的结果。

标签: rdatetime

解决方案


我们将 'Start_dates/End_dates' 转换为日期时间,并用于map2获取序列

library(tidyverse)
library(lubridate)
data %>%
    # convert dates to DateTime object
    mutate_at(vars(ends_with('dates')), dmy_hms) %>%
    # get the sequence between corresponding Start/End dates 
    mutate(times =  map2(Start_dates, End_dates, seq, by = "1 min")) %>%
    # unnest to expand the list column
    unnest(times) %>% 
    # select the wanted columns
    select(id, times)
#   id               times
#1   1 2016-10-20 00:00:00
#2   1 2016-10-20 00:01:00
#3   1 2016-10-20 00:02:00
#4   1 2016-10-23 00:00:00
#5   1 2016-10-23 00:01:00
#6   1 2018-03-01 00:00:00
#7   1 2018-03-01 00:01:00
#8   2 2018-12-05 00:00:00
#9   2 2018-12-05 00:01:00
#10  2 2018-12-05 00:02:00
#11  3 2016-04-02 00:00:00
#12  3 2016-04-02 00:01:00

推荐阅读