Преобразование разных форматов времени в один и тот же формат и поиск разницы между двумя временами - PullRequest
0 голосов
/ 07 августа 2020

Надеюсь, у вас все хорошо.

Я работал над этой конкретной проблемой поиска разницы во времени между двумя временами (которые во всех разных форматах). Я частично решил это для некоторых случаев, однако на данный момент не могу понять, как создать решение для всех случаев.

Мой пошаговый процесс включает:

  • Преобразование все данные (изначально в формате String) в формате datetime

  • Поиск случаев, когда время было по-разному выражено в формате String для правильного преобразования в формат datetime без потери точности PM, по-прежнему PM, а не преобразуется в AM, если это '4', а не 4PM или 16:00

  • Затем ... вычисление разницы между 2 раза (один раз в формате datetime)

Некоторые особенности включают определение разницы во времени для следующих времен (изначально сохраненных как строки и в этом примере):

  • 16-19
  • 19.30-20.00
  • 17: 00-18: 00
  • 4-5
  • 17-17.10
  • 16–18 (да, пробел между цифрами и дефисом сделан намеренно, хотя некоторые строковые манипуляции должны r решить это довольно просто)
  • 12 - 14

Мне удалось преобразовать 16-19 в: 16:00:00 и 19:00:00, однако для Пример 19.30-20.00, я получаю следующую ошибку: ValueError("unconverted data remains: %s" % ValueError: unconverted data remains: .30.

Я предполагаю, что это связано с моей реализацией кода:

theDate1, theDate2 = datetime.strptime(temp[0: temp.find('-')], "%H"), datetime.strptime(temp[temp.find('-') + 1: len(temp)], "%H")

.. . где 19.30-20.00 включает часть% M, а не только% H, поэтому код не говорит, что делать с частью: 30. Я собирался попробовать условную часть, в которой, если строка имеет 16-19, запустите какой-нибудь код, а если строка имеет 19.30-20.00, запустите другой код (и то же самое для других примеров).

Извините, если Мое объяснение звучит повсюду ... Я нахожусь в свободном пространстве, собирая решение вместе и пробуя все разные комбинации.

Спасибо за любые советы по этому поводу!

Есть добрый день.

Ответы [ 2 ]

1 голос
/ 07 августа 2020

вот способ разобрать строки примера с помощью парсера dateutil после небольшой предварительной обработки:

from dateutil import parser

strings = ['16-19', '19.30-20.00', '5PM-6PM', '4-5' ,'5-5.10PM', '16 - 18', '12 - 14']
datepfx = '2020-07-21 ' # will prefix this so parser.parse works correctly

for s in strings:
    # split on '-', strip trailing spaces
    # replace . with : as time separator, ensure upper-case letters
    parts = [part.strip().replace('.',':').upper() for part in s.split('-')]
    # if only one number is given, assume hour and add minute :00
    parts = [p+':00' if len(p)==1 else p for p in parts]
    # check if AM or PM appears in only one of the parts
    ampm = [i for i in ('AM', 'PM') for p in parts if i in p]
    if len(ampm) == 1:
        parts = [p+ampm[0] if not ampm[0] in p else p for p in parts]      

    print(f"\n'{s}' processed to -> {parts}")
    print([parser.parse(datepfx + p).time() for p in parts])

дает

'16-19' processed to -> ['16', '19']
[datetime.time(16, 0), datetime.time(19, 0)]

'19.30-20.00' processed to -> ['19:30', '20:00']
[datetime.time(19, 30), datetime.time(20, 0)]

'5PM-6PM' processed to -> ['5PM', '6PM']
[datetime.time(17, 0), datetime.time(18, 0)]

'4-5' processed to -> ['4:00', '5:00']
[datetime.time(4, 0), datetime.time(5, 0)]

'5-5.10PM' processed to -> ['5:00PM', '5:10PM']
[datetime.time(17, 0), datetime.time(17, 10)]

'16 - 18' processed to -> ['16', '18']
[datetime.time(16, 0), datetime.time(18, 0)]

'12 - 14' processed to -> ['12', '14']
[datetime.time(12, 0), datetime.time(14, 0)]
1 голос
/ 07 августа 2020

Ошибка довольно явная: вы пытаетесь разобрать '19 .30 'с форматом'% H ', который соответствует 19, поэтому' .30 'остается несоответствующим.

Использование формата'% Вместо этого у меня работает H.% M;)

Также обратите внимание на пакет dateutil, он предназначен для облегчения синтаксического анализа. Например:

>>> from datetutil.parser import parse
>>> parse('5PM')
datetime.timedelta(seconds=3600)
>>> parse('19h') - parse('17h45')
datetime.timedelta(seconds=4500)
>>> parse('19:00') - parse('18:30')
datetime.timedelta(seconds=1800)

Он действительно мощный и может позаботиться о многих мелких деталях, таких как пробелы и тому подобное;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...