【问题标题】:Expand all time steps between two dates展开两个日期之间的所有时间步长
【发布时间】:2018-07-21 15:30:17
【问题描述】:

我有一系列事件的开始和结束日期:

library(lubridate)
df<-tibble(StartDate=ymd_hm(c("2018-01-01 00:10","2018-01-02 00:20","2018-01-05 08:20"),tz="EET"),
       EndDate=ymd_hm(c("2018-01-01 00:10","2018-01-02 01:30","2018-01-05 08:30"),tz="EET"),
       Event=c("Event1","Event2","Event3"))

对于每个事件,我希望所有事件都发生 10 分钟。我可以用循环和列表来做到这一点:

DateTime=list()
Event=list()
for (i in 1:nrow(df)){
  DateTime[[i]]<-seq(df$StartDate[i],df$EndDate[i],by="10 min")
  Event[[i]]<-rep(df$Event[i],times=length(DateTime[[i]]))
}

result<-tibble(DateTime=do.call("c",DateTime),Event=do.call("c",Event))

期望的输出:

> result
# A tibble: 11 x 2
   DateTime            Event 
   <dttm>              <chr> 
 1 2018-01-01 00:10:00 Event1
 2 2018-01-02 00:20:00 Event2
 3 2018-01-02 00:30:00 Event2
 4 2018-01-02 00:40:00 Event2
 5 2018-01-02 00:50:00 Event2
 6 2018-01-02 01:00:00 Event2
 7 2018-01-02 01:10:00 Event2
 8 2018-01-02 01:20:00 Event2
 9 2018-01-02 01:30:00 Event2
10 2018-01-05 08:20:00 Event3
11 2018-01-05 08:30:00 Event3

但我正在寻找一种更微妙的方式,也许使用 tidyverse 函数。

请注意,您可能需要使用您的系统时区更改“EET”,以使示例完全可重现。

谢谢

【问题讨论】:

    标签: r time


    【解决方案1】:

    一种选择是使用map2 获取'StartDate' 和'EndDate' 的对应元素之间的序列,然后执行unnest

    library(tidyverse)
    df %>%
      transmute(DateTime = map2(StartDate, EndDate, seq, by = "10 min"), 
                Event) %>%
      unnest  %>%
      select(DateTime, Event)
    # A tibble: 11 x 2
    #   DateTime            Event 
    #   <dttm>              <chr> 
    # 1 2018-01-01 00:10:00 Event1
    # 2 2018-01-02 00:20:00 Event2
    # 3 2018-01-02 00:30:00 Event2
    # 4 2018-01-02 00:40:00 Event2
    # 5 2018-01-02 00:50:00 Event2
    # 6 2018-01-02 01:00:00 Event2
    # 7 2018-01-02 01:10:00 Event2
    # 8 2018-01-02 01:20:00 Event2
    # 9 2018-01-02 01:30:00 Event2
    #10 2018-01-05 08:20:00 Event3
    #11 2018-01-05 08:30:00 Event3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 2013-08-09
      • 2020-05-01
      • 2013-10-07
      • 1970-01-01
      • 2018-12-26
      相关资源
      最近更新 更多