Python供应链/制造场景下DataFrame分组聚合需求:按Lot统计UnitsProduced总和并获取首尾日期时间
解决方案:按Lot分组聚合生产数据
没问题,这个需求用pandas的groupby和聚合操作就能轻松实现,我给你一步步拆解:
步骤1:准备示例数据
首先我们先把你提供的简化版DataFrame用代码还原出来:
import pandas as pd # 构建示例数据 data = { 'Lot': [1, 1, 2, 3, 3, 3], 'UnitsProduced': [5, 13, 20, 15, 6, 28], 'Date/StartTime': ['1/1/2021 8:00', '1/2/2021 10:00', '1/3/2021 7:00', '1/4/2021 14:30', '1/4/2021 20:00', '1/5/2021 7:00'], 'Date/EndTime': ['1/1/2021 13:00', '1/2/2021 14:00', '1/3/2021 11:00', '1/4/2021 19:00', '1/4/2021 22:00', '1/5/2021 13:00'] } df = pd.DataFrame(data)
步骤2:(可选但推荐)转换日期列为datetime类型
为了避免字符串排序导致的首尾时间错误,建议先把日期列转换成datetime格式:
df['Date/StartTime'] = pd.to_datetime(df['Date/StartTime']) df['Date/EndTime'] = pd.to_datetime(df['Date/EndTime'])
步骤3:分组聚合计算
使用groupby按Lot分组,然后通过agg方法指定每列的聚合规则:
UnitsProduced:求和(sum)Date/StartTime:取每组第一个值(first)Date/EndTime:取每组最后一个值(last)
代码如下:
# 分组聚合 result = df.groupby('Lot').agg( UnitsProduced=('UnitsProduced', 'sum'), Date_StartTime=('Date/StartTime', 'first'), Date_EndTime=('Date/EndTime', 'last') ).reset_index() # 重命名列以匹配你期望的格式 result = result.rename(columns={ 'UnitsProduced': 'Units Produced', 'Date_StartTime': 'Date/StartTime', 'Date_EndTime': 'Date/EndTime' }) # 如果需要将日期转回原字符串格式(可选) result['Date/StartTime'] = result['Date/StartTime'].dt.strftime('%m/%d/%Y %H:%M') result['Date/EndTime'] = result['Date/EndTime'].dt.strftime('%m/%d/%Y %H:%M')
最终结果
运行上面的代码后,你会得到完全符合需求的结果:
Lot Units Produced Date/StartTime Date/EndTime 0 1 18 01/01/2021 08:00 01/02/2021 14:00 1 2 20 01/03/2021 07:00 01/03/2021 11:00 2 3 49 01/04/2021 14:30 01/05/2021 13:00
如果你的实际数据有更多列或者特殊格式,只需要调整agg里的规则就可以啦~
内容的提问来源于stack exchange,提问作者Shane
相关产品推荐
相关产品推荐

