
本文介绍如何使用 pandas 高效计算每日在园人数及所有人累计停留天数,核心是通过 `entry - exit` 的累积和(cumsum)建模人员净留存,并对每日在园人数求和得到总人天数。
在人员进出管理类场景(如园区、宿舍、访客系统)中,常需统计“总人天数”(total person-days)——即所有人员在园区内停留的天数之和。给定每日新增进入人数(entry_persons)与当日离开人数(exit_persons),我们需推算出每日实际在园人数,再对其累加,即可得总人天数。
关键逻辑在于:
- 每日在园人数 = 前一日在园人数 + 当日进入人数 − 当日离开人数;
- 初始日(day 1)无前序存量,故在园人数 = entry_persons[0] − exit_persons[0];
- 这正符合「差值序列的累积和」(cumulative sum of net flow)模型。
使用 Pandas 可一行完成该计算:
import pandas as pd
df = pd.DataFrame({
'day': [1, 2, 3, 4, 5],
'entry_persons': [4, 2, 3, 5, 0],
'exit_persons': [0, 1, 4, 0, 1]
})
# 计算每日在园人数(即“存量”)
df['in_campus'] = (df['entry_persons'] - df['exit_persons']).cumsum()
# 输出结果
print(df)运行后得到:
day entry_persons exit_persons in_campus 0 1 4 0 4 1 2 2 1 5 2 3 3 4 4 3 4 5 0 9 4 5 0 1 8
此时,in_campus 列即为每日结束时的实际在园人数(等价于次日开始时的存量)。而题目所求的「总停留天数」,正是将这 5 天的在园人数相加:
total_person_days = df['in_campus'].sum() # → 30
✅ 注意事项:
- 该方法隐含假设:所有人在当日进入后即计入当日停留,且当日离开者不计当日停留(符合常规业务逻辑:如早 9 点入、晚 6 点离,计为 1 天);
- 若需支持更精细的时间粒度(如按小时进出),应转为事件驱动的时间序列(如用 pd.to_datetime + resample),而非日级汇总;
- exit_persons 不可超过当前存量(否则 cumsum 会出现负值),生产环境中建议添加校验:
assert (df['in_campus'] >= 0).all(), "Exit exceeds current occupancy!"
综上,df['entry'] - df['exit'].cumsum() 是解决此类“动态存量+累计人天”问题的简洁范式,兼具可读性与执行效率,适用于千万行级日志聚合分析。










