【问题标题】:Count number of booking per day, using check-in and check-out dates in Python使用 Python 中的入住和退房日期计算每天的预订数量
【发布时间】:2021-04-19 16:09:08
【问题描述】:

我正在尝试计算(计数)每天的预订数量。我的数据集包含入住日期、退房日期。每行代表一个预订。

我有以下代码来计算每天的预订数量:

df['duration'] = df['check-in date'] - df['check-out date']
df = df.groupby(['check-in date']).count()

我的问题是我不知道如何将停留时间纳入我的计算中。目前,它只计算每天的预订量,而不考虑停留时间。 如果入住日期为 2020 年 1 月 1 日且持续时间为 3 天,我希望此预订计入 2020 年 1 月 1 日、2020 年 2 月 1 日和 2020 年 3 月 1 日。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    无需计算持续时间。使用pd.date_range 获取每行的check-in-datecheck-out-date 之间的日期列表。然后使用.explode 为日期列表中的每个元素创建一个新行。然后使用.value_counts() 获取每个日期的计数。

    代码:

    out = (df.apply
               (
                  lambda x: pd.date_range(
                         x['check-in-date'],  x['check-out-date'], freq = 'd'), 
                  axis = 1
                )
              .explode()
              .value_counts()
              .sort_index()
          )
    

    输入:

    df = pd.DataFrame({'check-in-date':['1/1/2020', '2/1/2020'],
                      'check-out-date': ['3/1/2020', '5/1/2020']})
    >>> df
      check-in-date check-out-date
    0    2020-01-01     2020-01-03
    1    2020-01-02     2020-01-05
    

    输出:

    >>> out
    2020-01-01    1
    2020-01-02    2
    2020-01-03    2
    2020-01-04    1
    2020-01-05    1
    dtype: int64
    

    【讨论】:

      【解决方案2】:

      例如我们的预订日历是这样的:

      in          out
      1984-01-01  1984-01-04
      1984-01-02  1984-01-04
      1984-01-03  1984-01-05
      1984-01-04  1984-01-05
      

      首先,我们必须将字符串格式化为日期时间。

      df['date_in'] = pd.to_datetime(df['in'], format='%d.%m.%Y')
      df['date_out'] = pd.to_datetime(df['out'], format='%d.%m.%Y')
      df=df.drop(['in','out'],axis=1)
      

      输出

      date_in date_out
      1984-01-01  1984-01-04
      1984-01-02  1984-01-04
      1984-01-03  1984-01-05
      1984-01-04  1984-01-05
      

      那么我们必须用 pd.date_range 写入除最后一天之外的所有日期范围。

      df['DATE'] = [pd.date_range(s, e, freq='d',closed='left') for s, e in
                    zip(pd.to_datetime(df['date_in']), pd.to_datetime(df['date_out']))]
      

      然后爆炸并计数

      df.explode('DATE').groupby('DATE').size()
      

      输出

      DATE
      1984-01-01    1
      1984-01-02    2
      1984-01-03    3
      1984-01-04    2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多