基于日期范围计算酒店每日入住人数(求和法)
基于Pandas生成酒店每日入住人数统计
原始数据结构
给定的酒店入住记录DataFrame如下:
| entry_date | exit_date | days | other_columns |
|---|---|---|---|
| 2022-02-01 | 2022-02-05 | 5 | ... |
| 2022-02-02 | 2022-02-03 | 2 | ... |
| 2022-04-10 | 2022-04-13 | 4 | ... |
| 2022-04-11 | 2022-04-12 | 2 | ... |
| 2022-04-12 | 2022-04-13 | 2 | ... |
| 2022-11-10 | 2022-11-15 | 6 | ... |
目标需求
生成每日实时入住人数的DataFrame,格式如下:
| date | ocupation |
|---|---|
| 2022-02-01 | 1 |
| 2022-02-02 | 2 |
| 2022-02-03 | 2 |
| 2022-02-04 | 1 |
| 2022-02-05 | 1 |
| 2022-04-10 | 1 |
| 2022-04-11 | 2 |
| 2022-04-12 | 3 |
| 2022-04-13 | 2 |
| 2022-11-10 | 1 |
| 2022-11-11 | 1 |
| 2022-11-12 | 1 |
| 2022-11-13 | 1 |
| 2022-11-14 | 1 |
| 2022-11-15 | 1 |
解决方案代码
以下是实现逻辑的Python代码,核心思路是生成每个客人的入住日期序列,再按日期统计人数:
import pandas as pd # 构造原始DataFrame(实际使用时可替换为你的数据源) data = { 'entry_date': ['2022-02-01', '2022-02-02', '2022-04-10', '2022-04-11', '2022-04-12', '2022-11-10'], 'exit_date': ['2022-02-05', '2022-02-03', '2022-04-13', '2022-04-12', '2022-04-13', '2022-11-15'], 'days': [5, 2, 4, 2, 2, 6], 'other_columns': ['...'] * 6 } df = pd.DataFrame(data) # 1. 将entry_date转换为datetime类型,方便生成日期序列 df['entry_date'] = pd.to_datetime(df['entry_date']) # 2. 为每个客人生成对应的入住日期列表,天数由days字段指定 df['date'] = df.apply(lambda row: pd.date_range(start=row['entry_date'], periods=row['days']), axis=1) # 3. 展开日期列表,让每个日期单独成为一行 df_exploded = df.explode('date') # 4. 按日期分组统计当日入住人数,并重命名列名 occupation_df = df_exploded.groupby('date').size().reset_index(name='ocupation') # 5. 可选:将日期格式化为字符串(与目标格式一致) occupation_df['date'] = occupation_df['date'].dt.strftime('%Y-%m-%d') # 查看结果 print(occupation_df)
代码说明
- 日期转换:先把
entry_date转为datetime类型,是生成连续日期序列的基础。 - 生成日期序列:利用
pd.date_range,以entry_date为起点,days为周期数,生成每个客人的所有入住日期。 - 展开行:
explode方法将每个客人的日期列表拆分成多行,每一行对应一个日期和一位客人。 - 统计人数:
groupby('date').size()统计每个日期的记录数,即当日的入住人数。 - 格式调整:最后将日期转为字符串格式,匹配目标输出的日期样式。
内容的提问来源于stack exchange,提问作者Carola
相关产品推荐
相关产品推荐

