Каков простой способ проверки данных планирования в 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")