【问题标题】:Aggregate dates into periods将日期聚合为期间
【发布时间】:2017-03-06 23:18:07
【问题描述】:

我们有 2 个月的数据。日期格式如下:mm/dd/yyyy。我们希望有 4 个时期(每 2 周):

Period1: 06/01/15 - 06/15/15
Period2: 06/16/15 - 06/30/15
Period3: 07/01/15 - 07/15/15
Period4: 07/16/15 - 07/31/15

通过这种方式,我们想在我们的数据集中添加 4 个额外的虚拟列,即 Period1、Period2 等。

输出示例:

【问题讨论】:

    标签: r date period


    【解决方案1】:

    查看 strptime 以将您的 mm/dd/yyyy 日期转换为数字,然后 split() 应该会有所帮助,请查看此 Split time-series weekly in R 以开始..

    z

    【讨论】:

      【解决方案2】:

      您需要将字符串转换为某种形式的日期。我使用POSIXct。 之后,您可以使用cut 将日期分组。从组中,您可以使用model.matrix 创建虚拟变量。我添加了几个测试日期以更好地说明结果。

      Breaks = as.POSIXct(c("06/01/15", "06/16/15", "07/01/15",
          "07/16/15", "08/01/15"), format="%m/%d/%y")
      
      TestData = c("06/15/15", "06/13/15", "06/20/15", "07/17/15")
      Periods  = cut(as.POSIXct(TestData, format="%m/%d/%y"), breaks=Breaks)
      as.numeric(Periods)
      [1] 1 1 2 4
      
      Dummies = model.matrix(~ Periods - 1)
        Periods2015-06-01 Periods2015-06-16 Periods2015-07-01 Periods2015-07-16
      1                 1                 0                 0                 0
      2                 1                 0                 0                 0
      3                 0                 1                 0                 0
      4                 0                 0                 0                 1
      
      Result = data.frame(TestData, Dummies)
      names(Result) = c("Date", "Period1", "Period2", "Period3", "Period4")
      Result
            Date Period1 Period2 Period3 Period4
      1 06/15/15       1       0       0       0
      2 06/13/15       1       0       0       0
      3 06/20/15       0       1       0       0
      4 07/17/15       0       0       0       1
      

      【讨论】:

        【解决方案3】:

        另一种可能是使用lubridate:

         library(lubridate)
        
         Period1 <- interval(start = mdy("06/01/15"), end = mdy("06/15/15"))
         Period2 <- interval(start = mdy("06/16/15"), end = mdy("06/30/15"))
         Period3 <- interval(start = mdy("07/01/15"), end = mdy("07/15/15"))
         Period4 <- interval(start = mdy("07/16/15"), end = mdy("07/31/15"))
        
         Period <- list(Period1, Period2, Period3, Period4)
        
         TestData <- mdy(c("06/15/15", "06/13/15", "06/20/15", "07/17/15"))
        
         sapply(1:length(TestData), function(x){
           as.numeric(TestData %within% Period[[x]])
         })
        

        【讨论】:

          猜你喜欢
          • 2020-04-16
          • 2012-02-27
          • 2014-12-18
          • 1970-01-01
          • 2021-11-30
          • 2022-01-13
          • 1970-01-01
          • 2017-12-28
          • 1970-01-01
          相关资源
          最近更新 更多