如何从生产时间列表中按周提取起止时间并计算总时长?
设备每周使用时间窗口计算方案
核心逻辑是按设备编号+周数分组,取每组最早的启动时间和最晚的结束时间,计算两者的时间差即为该周的使用窗口总时长。以下是两种常用实现方式:
一、Python Pandas 实现(适合本地表格数据)
import pandas as pd # 读取数据(实际可替换为pd.read_csv/pd.read_excel) data = pd.DataFrame({ 'Action': ['Setup', 'MFG', 'Setup', 'MFG'], 'Date Time Start': ['9/12/2022 1:00', '9/12/2022 3:00', '9/13/2022 14:00', '9/13/2022 15:30'], 'Date Time End': ['9/12/2022 3:00', '9/13/2022 13:00', '9/13/2022 15:30', '9/16/2022 22:00'], 'Week Num': [1,1,1,1], 'Lot Num': ['12345','12345','54321','54321'], 'Machine Num': [101,101,101,101] }) # 转换时间列为可计算的datetime格式 data['Date Time Start'] = pd.to_datetime(data['Date Time Start'], format='%m/%d/%Y %H:%M') data['Date Time End'] = pd.to_datetime(data['Date Time End'], format='%m/%d/%Y %H:%M') # 按设备+周分组,提取最早启动、最晚结束时间 weekly_window = data.groupby(['Machine Num', 'Week Num']).agg( earliest_start=('Date Time Start', 'min'), latest_end=('Date Time End', 'max') ).reset_index() # 计算总时长并格式化为HH:MM weekly_window['Total Hours'] = (weekly_window['latest_end'] - weekly_window['earliest_start']).dt.total_seconds() / 3600 weekly_window['Total Duration'] = weekly_window['Total Hours'].apply(lambda x: f"{int(x)}:{int((x%1)*60):02d}") # 输出结果 print(weekly_window)
运行后将得到周1的总时长为117:00,与需求一致。
二、SQL 实现(适合数据库存储的数据)
以下以MySQL为例,其他数据库仅需调整时间差函数:
SELECT Machine_Num, Week_Num, MIN(Date_Time_Start) AS earliest_start, MAX(Date_Time_End) AS latest_end, TIMESTAMPDIFF(HOUR, MIN(Date_Time_Start), MAX(Date_Time_End)) AS total_hours, -- 格式化为HH:MM CONCAT( TIMESTAMPDIFF(HOUR, MIN(Date_Time_Start), MAX(Date_Time_End)), ':', LPAD(TIMESTAMPDIFF(MINUTE, MIN(Date_Time_Start), MAX(Date_Time_End)) % 60, 2, '0') ) AS total_duration FROM production_data GROUP BY Machine_Num, Week_Num;
注意事项
- 确保时间列格式解析正确,若数据中有不同时间格式,需调整
pd.to_datetime的format参数或SQL的时间转换函数 - 若需计算实际运行时长(排除空闲间隙),则将分组逻辑改为累加每行的时长:
sum(Date_Time_End - Date_Time_Start) - 多设备场景下必须按
Machine Num分组,避免跨设备时间混淆
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

