【问题标题】:How to count the dates that are not in a list如何计算不在列表中的日期
【发布时间】:2020-01-05 06:37:43
【问题描述】:

我在客户的两个日期(date1 date2)和到达日期之间有一个数据框。

date1<- "2019-07-29"
date2<- "2019-08-08"

clients<-data.frame(id= c(1:10),
                    arrive=c("2019-07-31", "2019-07-29", "2019-08-01",
                             "2019-08-03", "2019-08-05", "2019-08-08", 
                             "2019-08-02", "2019-08-06", "2019-07-29", 
                             "2019-08-02"),
                    hotel= c(rep(900067, 5), rep(9001649,5)))

我想计算日期之间,每家酒店有多少天没有新客户。

900067酒店在以下几天没有新客户:2019-07-30、2019-08-02、2019-08-04、2019-08-06、2019-08-07、2019-08-08。这是 date1 和 date2 之间的 6 天,没有任何新客户。

数据框结果应该是这样的:

Result<- data.frame(hotel= c(900067, 9001649), 
                    days_without_new_clients= c(6, 7))

提前谢谢你。

【问题讨论】:

    标签: r date dataframe


    【解决方案1】:

    也许您可以创建一个包含所有酒店日期的数据框,然后查看clientsdata 中不存在的数据框。

    library(dplyr)
    
    all_hotel_dates <- expand.grid(arrive = seq.Date(as.Date("2019-07-29"), as.Date("2019-08-08"), "day"), hotel = c(900067, 9001649))
    
    clients %>%
      mutate(arrive = as.Date(arrive)) %>%
      full_join(all_hotel_dates) %>%
      group_by(hotel) %>%
      summarise(days_without_new_clients = sum(is.na(id)))
    
    # A tibble: 2 x 2
        hotel days_without_new_clients
        <dbl>                    <int>
    1  900067                        6
    2 9001649                        7
    

    【讨论】:

      【解决方案2】:

      这是一个想法,通过dplyr 使用complete 来填写我们过滤到所需时间段后的日期,即

      library(dplyr)
      
      clients %>% 
       mutate(arrive = as.Date(arrive)) %>% 
       group_by(hotel) %>% 
       filter(arrive >= as.Date(date1) & arrive <= as.Date(date2)) %>% 
       complete(arrive = seq.Date(as.Date(date1), as.Date(date2), 1)) %>%
       summarise(days_no_clients = sum(is.na(id)))
      
      # A tibble: 2 x 2
      #    hotel days_no_clients
      #    <dbl>           <int>
      #1  900067               6
      #2 9001649               7
      

      【讨论】:

        【解决方案3】:

        您可以创建一个接收 2 个日期并返回字符串数组的 udf。

        类似这样的东西(伪代码):

        def getDatesBetween(dateA, dateB):
          days = time.difference(dateA, dateB).days
          dates = range(days).map(d => time.add(dateA, d).toString)
          return dates
        

        然后创建一个新列,其中包含这些日期和到达日期之间的交集。

        【讨论】:

        • 它被标记为R问题,而不是python
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 2015-07-24
        • 1970-01-01
        • 2020-05-31
        • 2020-08-24
        • 2014-10-01
        相关资源
        最近更新 更多