通过日期对比计算DataFrame列值:统计各地点月度在籍人数
按地点统计未来3个月在籍人数的实现方案
核心思路
- 将原始的月份缩写日期(如
MAY2025)转换为标准datetime格式,方便日期比较 - 动态生成指定起始月份的未来3个月列
- 逐个判断员工在对应月份是否在籍,最后按地点聚合统计人数
完整代码
import pandas as pd # 原始数据 x = pd.DataFrame({ 'Location': ['Paris', 'Dallas', 'Tokyo', 'London'], 'Departing': ['MAY2025', 'JUN2025', 'APR2025', 'JUN2025'], 'Arriving': ['MAR2025', 'JUN2025', 'JUN2025', 'APR2025'], }) # 转换日期列为标准datetime格式(取当月第一天) x['Arriving'] = pd.to_datetime(x['Arriving'], format='%b%Y') x['Departing'] = pd.to_datetime(x['Departing'], format='%b%Y') # 定义起始月份(可按需修改,比如改为'2025-05') start_month = '2025-04' start_date = pd.to_datetime(start_month) # 生成未来3个月的列名(格式:YYYY-MM) months = pd.date_range(start=start_date, periods=3, freq='MS') month_cols = months.strftime('%Y-%m') # 为每个月份生成在籍标记(1表示在籍,0表示不在籍) for col in month_cols: month_start = pd.to_datetime(col) month_end = month_start + pd.offsets.MonthEnd(0) # 判断逻辑:到岗日期不晚于当月末,且离职日期不早于当月初 x[col] = ((x['Arriving'] <= month_end) & (x['Departing'] >= month_start)).astype(int) # 按地点分组,统计各月份在籍人数 result = x.groupby('Location')[month_cols].sum().reset_index() print(result)
代码说明
- 日期转换:用
pd.to_datetime配合format='%b%Y'解析月份缩写+年份的格式,确保日期可比较 - 动态生成月份列:修改
start_month参数即可切换统计起始月,实现按月复用 - 在籍判断逻辑:员工在某月份在籍的条件为「到岗时间不晚于当月最后一天,且离职时间不早于当月第一天」,覆盖整月在职的情况
- 聚合统计:通过
groupby按地点分组,对各月份的标记值求和得到在籍人数
内容的提问来源于stack exchange,提问作者be84
相关产品推荐
相关产品推荐

