You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:15:03