【问题标题】:Calculate weeks between date range and days in each weeks between the range计算日期范围之间的周数和范围之间的每周天数
【发布时间】:2018-03-19 12:25:20
【问题描述】:

输入数据帧

ID RID PID check_in check_out 10240 1 1 13-08-2014 9.30 14-08-2014 9.30 10240 2 1 16-08-2014 9.30 17-08-2014 9.30 10240 3 2 18-09-2012 9.30 25-09-2012 9.30 10240 4 1 25-09-2012 9.30 30-09-2012 9.30 10240 5 1 27-01-2015 22.30 27-02-2015 20.30

期待输出

ID RID PID check_in check_out Weekite Weekstart Weekgrp Days 10240 1 1 13-08-2014 9.30 14-08-2014 9.30 1 10-08-2014 10-08-2014 1 10240 2 1 16-08-2014 9.30 17-08-2014 9.30 1 10-08-2014 10-08-2014 1 10240 3 2 18-09-2012 9.30 25-09-2012 9.30 1 16-09-2012 16-09-2012 7 10240 4 1 25-09-2012 9.30 30-09-2012 9.30 1 23-09-2012 23-09-2012 5 10240 5 1 27-01-2015 22.30 27-02-2015 20.30 5 25-01-2015 25-01-2015 5 10240 5 1 27-01-2015 22.30 27-02-2015 20.30 5 25-01-2015 01-02-2015 7 10240 5 1 27-01-2015 22.30 27-02-2015 20.30 5 25-01-2015 08-02-2015 7 10240 5 1 27-01-2015 22.30 27-02-2015 20.30 5 25-01-2015 15-02-2015 7 10240 5 1 27-01-2015 22.30 27-02-2015 20.30 5 25-01-2015 22-02-2015 5

但是我没有得到预期的输出。

下面是我的代码:

output_df <- weektest %>% 
  group_by(ID, RID,PID) %>%
  mutate(Weekite = ceiling(difftime(strptime(check_out, format = "%Y-%m-%d"),
                            strptime(check_in, format = "%Y-%m-%d"),units="weeks"))) %>%
  mutate(Weekstart = as.Date(cut(check_in,
                                 breaks = "week",
                                 start.on.monday = FALSE))) %>%

  mutate(Weekgrp = list(seq(Weekstart[1], by="week", length.out=Weekite[1]))) %>%
  unnest %>%

  mutate(Days = if(n() > 1)
                       case_when(

                         row_number() == 1L ~ day(Weekgrp[2]) - day(check_in),
                         row_number() == n() ~ day(check_out) - day(Weekgrp[n()]),
                         row_number() != 1L | n() ~ day(Weekgrp[n()]) - day(Weekgrp[n()-1]),
                         )
              else day(check_out)- day(check_in)

  )

row_number() == 1L ~ day(Weekgrp[2]) - day(check_in) 行给出的 Days 错误为 -26

请帮忙。

【问题讨论】:

  • 您能否编辑您的问题以包含有关您要生成的变量的一些详细信息(即WeekiteWeekstartWeekgrp),而不是让我们根据你的代码。
  • @MauritsEvers 实际上我对 Weekgrp 很感兴趣,它为我提供了在给定日期范围和每周天数之间的一周开始日期。生成 Weekite 和 Weekstart 以获取 Weekgrp。它们不是必需的。
  • 所以Days 只是check_outcheck_in 之间的时间差?我仍然不确定Weekgrp 应该是什么。好像和Weekstart重合,但只针对部分条目?
  • 例如在 check_in 27-01-2015 和 check_out 27-02-2015 他们是 31 天。然而,这两个日期之间有 5 个不同的周。因此,如果我想查看这些日期范围之间的每周天数,那么我需要周数和天数。现在 27/01/2015 属于第 25/01/2015 周,因此本周的天数为 5。
  • 您能否详细说明weekgrp背后的逻辑?

标签: r dplyr


【解决方案1】:

这是可能的解决方案之一:

output_df <- weektest %>% 
  group_by(ID, RID,PID) %>%
  mutate(Weekstart = as.Date(cut(check_in,
                                 breaks = "week",
                                 start.on.monday = FALSE))) %>% 
  mutate(Weekite = ceil(difftime(strptime(check_out, format = "%Y-%m-%d"),
                                 strptime(Weekstart, format = "%Y-%m-%d"),units="weeks"))) %>%  
  mutate(Weekgrp = list(seq(Weekstart[1], by="week", length.out=Weekite[1]))) %>%
  unnest %>%  
  mutate(Days = if(n() > 1)
    case_when(
      row_number() == 1L ~ as.numeric(Weekgrp[2] - as.Date(strptime(check_in,format = "%Y-%m-%d"))),
      row_number() == n() ~ as.numeric(as.Date(strptime(check_out,format = "%Y-%m-%d")) - Weekgrp[n()]),
      row_number() != 1L | n() ~ as.numeric(Weekgrp[n()] - Weekgrp[n()-1])
    )
    else as.numeric(as.Date(strptime(check_out,format = "%Y-%m-%d"))- as.Date(strptime(check_in,format = "%Y-%m-%d")))    
  )  
output_df$Weekite <- NULL
output_df$Weekstart <- NULL

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多