西瓜汁大数据 2023-03-28 20:45 采纳率: 0%
浏览 122
已结题

关于#运行时间 时间重叠 和非重叠#的问题,如何解决?

用spark sql 或者scala spark 实现都可以
机器回答的就算了,答的都不对,如果是真人写出来验证没问题可以加钱

OEE 设备综合效率(OEE)用来表现机器实际的生产能力相对于理论产能的比率
现在需要计算每个模组的真实有效运行的时间,一个大模组有多台机台,每个模组的机台数是不一样的。

如何判断定模组的有效运行时间:
1、模组有并行机台 以及串行机台,串行机台必须保证是同时都有在运行的时间,并行的机台只要这个时间有一台机器在运行,整个模组都是有效的,如果串行的机台在这个时间段没有运行,整个模组都不算运行时间
2、串行的时间要保证每个机台都有,并且是并行时间里面有包含串行的时间,如果串行的时间其中有一个机台时间没有,这个时间段都不算有效运行时间

以下是测试数据:

有2个表 一个配置表 一个实际设备运行表
配置表字段有:
TERMINL_ID -- 机台ID
TYPE --类型 Y并行 机台 null 串行机台
MODEL_ID --模组ID
MODEL_NAME --模组名称

设备表字段:
TERMINL_ID --机台ID
START_TIME --开始时间
END_TIME --结束数据
STATUS --状态

img

配置表:
TERMINL_ID TYPE MODEL_ID MODEL_NAME
1001 111 TEST
1002 Y 111 TEST
1003 Y 111 TEST
1004 111 TEST

测试数据:
TERMINL_ID START_TIME END_TIME STATUS
1001 2023/3/20 8:05 2023/3/20 8:08 running
1001 2023/3/20 8:00 2023/3/20 8:00 running
1002 2023/3/20 8:10 2023/3/20 8:11 running
1002 2023/3/20 8:11 2023/3/20 8:11 running
1003 2023/3/20 8:03 2023/3/20 8:05 running
1003 2023/3/20 8:06 2023/3/20 8:07 running
1004 2023/3/20 8:06 2023/3/20 8:11 running
1004 2023/3/20 8:11 2023/3/20 8:12 running
1005 2023/3/20 8:00 2023/3/20 8:07 running

  • 写回答

5条回答 默认 最新

  • 我爱OJ 2023-03-29 08:11
    关注

    您看看:

    import datetime
    config_data = [ 
        {'TERMINL_ID': '1001', 'TYPE': None, 'MODEL_ID': '111', 'MODEL_NAME': 'TEST'},
        {'TERMINL_ID': '1002', 'TYPE': 'Y', 'MODEL_ID': '111', 'MODEL_NAME': 'TEST'},
        {'TERMINL_ID': '1003', 'TYPE': 'Y', 'MODEL_ID': '111', 'MODEL_NAME': 'TEST'},
        {'TERMINL_ID': '1004', 'TYPE': None, 'MODEL_ID': '111', 'MODEL_NAME': 'TEST'}
    ]
    device_data = [
        {'TERMINL_ID': '1001', 'START_TIME': '2023/3/20 8:05', 'END_TIME': '2023/3/20 8:08', 'STATUS': 'running'},
        {'TERMINL_ID': '1001', 'START_TIME': '2023/3/20 8:00', 'END_TIME': '2023/3/20 8:00', 'STATUS': 'running'},
        {'TERMINL_ID': '1002', 'START_TIME': '2023/3/20 8:10', 'END_TIME': '2023/3/20 8:11', 'STATUS': 'running'},
        {'TERMINL_ID': '1002', 'START_TIME': '2023/3/20 8:11', 'END_TIME': '2023/3/20 8:11', 'STATUS': 'running'},
        {'TERMINL_ID': '1003', 'START_TIME': '2023/3/20 8:03', 'END_TIME': '2023/3/20 8:05', 'STATUS': 'running'},
        {'TERMINL_ID': '1003', 'START_TIME': '2023/3/20 8:06', 'END_TIME': '2023/3/20 8:07', 'STATUS': 'running'},
        {'TERMINL_ID': '1004', 'START_TIME': '2023/3/20 8:06', 'END_TIME': '2023/3/20 8:11', 'STATUS': 'running'},
        {'TERMINL_ID': '1004', 'START_TIME': '2023/3/20 8:11', 'END_TIME': '2023/3/20 8:12', 'STATUS': 'running'},
        {'TERMINL_ID': '1005', 'START_TIME': '2023/3/20 8:00', 'END_TIME': '2023/3/20 8:07', 'STATUS': 'running'}
    ]
    input_time_format = '%Y/%m/%d %H:%M'
    output_time_format = '%Y-%m-%d %H:%M:%S'
    def str_to_datetime(time_str):
        return datetime.datetime.strptime(time_str, input_time_format)
    def is_running(device, start_time, end_time):
        device_start_time = str_to_datetime(device['START_TIME'])
        device_end_time = str_to_datetime(device['END_TIME'])
        if device_start_time <= start_time and device_end_time >= end_time and device['STATUS'] == 'running':
            return True
        return False
    def is_valid_model(config, start_time, end_time):
        if config['TYPE'] == 'Y':
            # 并行机台
            for device in device_data:
                if device['TERMINL_ID'] == config['TERMINL_ID'] and is_running(device, start_time, end_time):
                    return True
            return False
        else:
            # 串行机台
            for sub_config in config_data:
                if sub_config['MODEL_ID'] == config['MODEL_ID']:
                    for device in device_data:
                        if device['TERMINL_ID'] == sub_config['TERMINL_ID']:
                            if not is_running(device, start_time, end_time):
                                return False
                    if str_to_datetime(device_data[-1]['END_TIME']) >= end_time and str_to_datetime(device_data[0]['START_TIME']) <= start_time:
                        return True
            return False
    def count_valid_time(model_id, start_time, end_time):
        count = 0
        for config in config_data:
            if config['MODEL_ID'] == model_id and is_valid_model(config, start_time, end_time):
                count += (str_to_datetime(end_time) - str_to_datetime(start_time)).total_seconds()
        return count
    
    
    
    start_time = '2023/3/20 8:00'
    end_time = '2023/3/20 8:12'
    model_id = '111'
    valid_time = count_valid_time(model_id, start_time, end_time)
    print('模组ID:%s 有效运行时间:%d秒' % (model_id, valid_time))
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月5日
  • 修改了问题 3月29日
  • 创建了问题 3月28日

悬赏问题

  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面