【问题标题】:How to find which date range a date is in?如何查找日期在哪个日期范围内?
【发布时间】:2013-09-09 02:15:22
【问题描述】:

我有一个包含 id 和发布日期的数据框,对于每个数据框,我想知道每个发布日期的日期范围 (Time_Seq)。

日期向量如下所示:

data:
    ID     LAUNCH_DATE
1 50314486  2004-01-01
2 55842774  2004-01-27

我有一个包含不同数据范围的时序数据框:

head(Time_Table):
  Time_Seq   DateFrom     DateTo
1      726 2003-12-29 2004-01-04
2      727 2004-01-05 2004-01-11
3      728 2004-01-12 2004-01-18
4      729 2004-01-19 2004-01-25
5      730 2004-01-26 2004-02-01
6      731 2004-02-02 2004-02-08

理想情况下,我希望输出如下所示:

    ID     LAUNCH_DATE   Time_Seq
1 50314486  2004-01-01      726
2 55842774  2004-01-27      731

目前,我可以通过以下方式快速计算出一个日期:

Time_Table$Time_Seq[which( (date$LAUNCH_DATE[1]>=Time_Table$DATEFROM)&(date$LAUNCH_DATE[1]<=Time_Table$DATETO) )]

谁能提出一种更简单的方法而不必以这种方式循环?

【问题讨论】:

    标签: r date loops


    【解决方案1】:

    我只是想在包lubridate 中玩interval%within%

    library(lubridate)
    
    # create intervals
    interval <- with(Time_Table, new_interval(ymd(DateFrom), ymd(DateTo)))
    
    # for each LAUNCH_DATE, test whether it falls within an interval, and pick corresponding Time_Seq
    data$Time_Seq <- sapply(data$LAUNCH_DATE, function(x) Time_Table$Time_Seq[ymd(x) %within% interval])
    

    【讨论】:

      【解决方案2】:

      cut 函数用于将连续变量分成几类,适用于日期。

      data$Time_Seq <- cut(
        data$LAUNCH_DATE, 
        c(Time_Table$DateFrom, Time_Table$DateTo[nrow(Time_Table)]), 
        labels = Time_Table$Time_Seq,
        right = FALSE
      )
      

      【讨论】:

      • 效果很好,谢谢@RichieCotton。我要添加的唯一补充是我需要向 Time_Table$DateFrom 添加一个额外的日期,这是关闭最终 Time_Seq 所必需的。
      猜你喜欢
      • 1970-01-01
      • 2016-09-22
      • 2016-10-08
      • 1970-01-01
      • 2013-05-02
      • 2017-11-26
      • 2021-09-07
      • 1970-01-01
      • 2019-02-28
      相关资源
      最近更新 更多