使用Python中的签入和签出日期统计每天的预订数量

使用Python中的签入和签出日期统计每天的预订数量,python,pandas,Python,Pandas,我正在计算每天的预订数量。我的数据集包含签入日期、签出日期。每行代表一次预订 我有以下代码来计算每天的预订数量: df['duration'] = df['check-in date'] - df['check-out date'] df = df.groupby(['check-in date']).count() 我的问题是,我不知道如何将停留时间合并到我的计算中。目前,它只计算每天的预订量,不考虑停留时间。 如果登记日期为2020年1月1日,持续时间为3天,我希望将此预订计入2020年1

我正在计算每天的预订数量。我的数据集包含签入日期、签出日期。每行代表一次预订

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

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日。

无需计算持续时间。使用
pd.date\u range
获取每行
签入日期
签出日期
之间的日期列表。然后使用
.explode
为日期列表中的每个元素创建新行。然后使用
.value\u counts()
获取每个日期的计数

代码:

输入:

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

例如,我们的预订日历如下:

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
首先,我们必须将字符串格式化为datetime

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
DATE
1984-01-01    1
1984-01-02    2
1984-01-03    3
1984-01-04    2
然后,我们必须用pd.date\u 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_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
DATE
1984-01-01    1
1984-01-02    2
1984-01-03    3
1984-01-04    2