Каков простой способ проверки данных планирования в python

Всем привет. Честно говоря, моя голова сейчас взорвется от этой ситуации. Я потратил целый день, чтобы решить эту проблему, но я не смог этого сделать, так что, наконец, я здесь, на stackoverflow, и прошу помощи у некоторых из вас, экспертов. кто может помочь мне в решении этой проблемы. У меня есть объект json, который содержит расписание на один день. Позвольте мне объяснить каждую часть этого, чтобы вы, ребята, поняли, где я борюсь до сих пор.

{
   "timings":{
      "id":43,
      "partition":7,
      "day_name":"Tuesday",
      "full_day":false,
      "close_day":false,
      "start_time":"2022-12-20 00:00:00",
      "close_time":"2022-12-20 23:00:00"
   },
   "pricings":[
      {
         "partition":7,
         "day_name":"Tuesday",
         "peak_hours":true,
         "start_time":"2022-12-20 17:00:00",
         "close_time":"2022-12-20 23:00:00",
         "price":"1300"
      },
      {
         "partition":7,
         "day_name":"Tuesday",
         "peak_hours":true,
         "start_time":"2022-12-20 00:00:00",
         "close_time":"2022-12-20 04:00:00",
         "price":"1300"
      },
      {
         "id":54,
         "partition":7,
         "day_name":"Tuesday",
         "peak_hours":false,
         "start_time":"2022-12-20 04:00:00",
         "close_time":"2022-12-20 17:00:00",
         "price":2000
      }
   ]
}

Как вы можете видеть, первый ключ - timings. Который содержит подробную информацию о магазине, когда он откроется и когда закроется. просто и красиво.

затем мы переходим ко второму ключу, который pricings. Это список объектов, который содержит, что это пиковый час или непиковый_час или когда они начинаются и когда они заканчиваются. Теперь возникает проблема: Как мы можем проверить все временные значения, такие как время начала и время закрытия каждой записи. Они не должны накладываться друг на друга. и все время должно быть в пределах времени открытия и закрытия магазина.

Например, с достоверными данными : магазин открывается в : час ночи магазин закрывается в : 11 утра

Теперь у нас есть список часов: первые часы пик начинаются в : 1 утра до 4 утра второе нерабочее время начинается в : 4 утра до 7 утра третий пик_часов снова начинается в : 7 утра до 11 утра .

например, в достоверных данных

первые часы пик начинаются в : 1 утра до 5 утра второе нерабочее время начинается в : 4 утра до 7 утра третий пик_часов снова начинается в : 7 утра до 11 утра .

как вы можете видеть в первой строке, часы пик начинаются с 1 часа ночи до 5 утра второе нерабочее время начинается с : 4 утра до 7 утра

здесь возникает проблема, что с 4 утра до 5 утра в нахлест, что один час попадает как в час пик, так и в непиковый час, так что этот ввод не действителен.

Я знаю, что это довольно сложно. Но любой, кто поможет мне, будет благодарен!!!

Предполагая, что объекты в списке pricings вводятся в хронологическом порядке (начало в 00:00:00, конец в 23:59:59), мы можем просто проверить, что разница между i close_time и i+1 start_time равна 0. Если это любое другое число, то должно быть перекрытие.

Это можно сделать с помощью datetime

import datetime

validFlag = True
for i in range(len(obj["pricings"])-1):
    currentClose = datetime.datetime.strptime(obj["pricings"][i]["close_time"],'%Y-%m-%d %H:%M:%S')
    nextStart = datetime.datetime.strptime(obj["pricings"][i+1]["start_time"],'%Y-%m-%d %H:%M:%S')
    if currentClose-nextStart==datetime.timedelta(0):
        pass
    else:
        validFlag = False

if validFlag:
    print("Valid")
else:
    print("Not Valid")

Здесь мы берем строки, указывающие время, изменяем их на время даты, находим разницу между ними. Если разница не равна 0, мы проверяем флаг, который указывает на то, что это не действительная запись.

Это работает в соответствии с вашими пожеланиями, если записи расположены в хронологическом порядке. Однако в вашем примере это не так. Поэтому мы рассмотрим пример и для этого случая. Единственным отличием во втором примере является использование list.sort() для сортировки времени

startTime = []
    closeTime = []
    for i in range(len(obj["pricings"])):
        startTime.append(datetime.datetime.strptime(obj["pricings"][i]["start_time"],'%Y-%m-%d %H:%M:%S'))
        closeTime.append(datetime.datetime.strptime(obj["pricings"][i]["close_time"],'%Y-%m-%d %H:%M:%S'))
    startTime.sort()
    closeTime.sort()
    validFlag = True
    for i in range(len(startTime)-1):
        if closeTime[i]-startTime[i+1]==datetime.timedelta(0):
            pass
        else:
            validFlag = False

    if validFlag:
        print("Valid")
    else:
        print("Not Valid")
Вернуться на верх