Pandas处理跨午夜日期范围的Groupby分组统计问题
解决跨午夜夜班分组统计的实现方案
核心思路
新增排班归属日期字段统一周期标识:将当日0-6点的记录归属到前一天的排班周期,和前一天18-24点的记录归为同一个夜班统计单元,解决自然日拆分夜班周期的问题。
完整实现代码
import pandas as pd import numpy as np # 1. 基础数据处理:合并日期、时间为完整datetime类型(如果原数据已为datetime类型可跳过格式转换步骤) df['datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time']) # 2. 计算排班归属日期:0-6点的记录归属到前一天的排班周期 df['schedule_date'] = np.where( df['Hour'] < 6, df['datetime'].dt.date - pd.Timedelta(days=1), df['datetime'].dt.date ) # 3. 重新确认班次:6-18点为白班,其余为夜班,inclusive参数可根据实际边界需求调整 df['Shift'] = np.where(df['Hour'].between(6, 18, inclusive='right'), 'Day', 'Night') # 4. 按排班归属日期、班次、活动类型分组统计 df_result = df.groupby(['schedule_date', 'Shift', 'Additional']).size().reset_index(name='Target Count') df_result['Cumulative Total'] = df_result['Target Count'].cumsum()
关键逻辑说明
schedule_date是解决跨天统计的核心字段:所有属于「前一日18点至当日6点」的夜班记录会被统一归属到前一日的排班日期,不会再出现同自然日两段夜班被合并统计的问题- 若原数据的
Date列已经是datetime类型,可直接用df['Date'] + pd.to_timedelta(df['Time'])生成完整datetime列,无需字符串拼接转换
内容的提问来源于stack exchange,提问作者Dave Stark
相关产品推荐
相关产品推荐

