разобрать время для правильного формата python - PullRequest
0 голосов
/ 03 июня 2019

У меня проблема с разбором с веб-сайта.

Время указывается в этом формате (9-10: 40, 11: 30, 6: 30-7: 20).

Если время недоступно, оно будет отображаться как TBA

Я хочу проанализировать время начала и окончания в формате 12H.

Этот метод не возвращает правильные значения. Например, если строка «11: 25-12: 15PM», я ожидаю получить [11:25 AM, 12:15 PM] Но на самом деле я получаю[11:25 PM, 12:15 PM]

def insertTime(initialTime):
if "TBA" in initialTime:
    return ["TBA", "TBA"]
startTime,endTime = initialTime.split("-")
try:
    if "PM" in endTime:
        startTimeHours = startTime.split(":")[0]
        if ":" in startTime:
            startTimeMinutes = ":" + startTime.split(":")[1]
        else:
            startTimeMinutes = ":00"
        if int(startTimeHours) in range(9,12):
            startTimeHours += startTimeMinutes + "AM"

    if ":" not in startTime:
        startTime +=":00"
    if "AM" not in startTime:
        startTime += endTime[-2:]

    return [startTime, endTime]
except Exception as e:
    print(f"Error insertTime: Start-> {startTime}, endTime->{endTime}")
    print(e)
    return [0,0]

Спасибо

1 Ответ

0 голосов
/ 03 июня 2019

Я думаю, что было бы проще, если бы вы явно обработали два возможных случая (AM и PM) для времени запуска:

import datetime

def parse_time(text):
    pm = None  # unknown

    if text[-2:] in ('AM', 'PM'):
        pm = (text[-2:] == 'PM')
        text = text[:-2]

    if ':' not in text:
        text += ':00'

    hours, minutes = text.split(':')
    hours = int(hours)
    minutes = int(minutes)

    if pm and hours < 12:
        hours += 12

    return datetime.time(hours, minutes), pm is not None


def parse_interval(text):
    if 'TBA' in text:
        return None, None

    start, end = text.split('-')

    start, is_exact = parse_time(start)
    end, _ = parse_time(end)  # end time should be exact

    # If both the start and end times are known then there's nothing left to do
    if is_exact:
        return start, end

    # start2 = start + 12 hours
    start2 = start.replace(hour=(start.hour + 12) % 24)
    start_AM, start_PM = sorted([start, start2])

    # Pick the most reasonable option
    if start_AM < end < start_PM:
        return start_AM, end
    elif start_AM < start_PM < end:
        return start_PM, end
    else:
        raise ValueError('This cannot happen')

if __name__ == '__main__':
    for text in [
        '9-10:40AM',
        '11-1:30PM',
        '6:30-7:20PM',
        '11:25-12:15PM',
        '2AM-12:15PM',
    ]:
        print(text.rjust(15), ':', *parse_interval(text))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...