Как преобразовать количество дней в часы, используя python строку формата даты и функцию strptime? - PullRequest
0 голосов
/ 22 февраля 2020

Я работаю с датами, полученными из mongoDB, однако, они не все в одном формате . Они бывают трех разных форматов:

1. '%H:%M:%S' (Hours:Minutes:Seconds)
2. '%H:%M:%S.f' (Hours:Minutes:Seconds:Milliseconds)
3. Days.Hours:Minutes:Seconds:Milliseconds

Я хочу рассчитать общее время для всех записей из базы данных. Даты хранятся в строковом формате, поэтому я использую функцию strptime для извлечения объекта времени, затем создаю timedelta, используя этот объект времени, чтобы я мог добавить все это:

formats = ('%H:%M:%S', '%%H:%M:%S.f', <3rd format here>)
for db_item in db_collection:
    for fmt in formats:
       try:
           temp = datetime.strptime(db_item, fmt)
           temp = datetime.timedelta(hours=temp.hour, 
                                     minutes=temp.minute, 
                                     seconds=temp.minute,
                                     milliseconds=(temp.microsecond / 1000)
           return temp
       except ValueError as e:

Проблема, однако, заключается в том, что 3-й формат, о котором я упоминал ранее, определяет n дней перед '.', поэтому я не знаю, как написать строку формата даты для этого формата.

пример

1.01:20:40.97

означает: 1 день (24 часа), 1 час, 20 минут, 40 секунд и 97 миллисекунд

что я Я стремлюсь к: 25: 20: 40.97 (24 часа + 1 час)

Есть ли формат, который позволяет это сделать? или я должен извлечь n дней отдельно, умножить на 24 и добавить вручную позже?

1 Ответ

0 голосов
/ 23 февраля 2020

Вы можете попробовать код формата %d. Однако вы можете столкнуться с ограничениями, поскольку %d - это день месяца, то есть это целое число в диапазоне (1, 31 + 1). datetime.datetime специализируется на датах и ​​времени, а не на длительностях.

Вероятно, проще проанализировать строку с помощью регулярных выражений и создать временную дельту непосредственно, чем использовать код формата %d.

Вот регулярное выражение, которое будет работать для всех 3 ваших форматов продолжительности.

import re
pattern = re.compile(
    """
    # 0? to remove leading zero
    # days and milliseconds are optional
    (?: (\d+). )?   # days
    0? (\d+):       # hours
    0? (\d+):       # minutes
    0? (\d+)        # seconds
    (?: . (\d+))?   # milliseconds
    """,
    re.VERBOSE
)

match = pattern.fullmatch("01:20:40")
if match is not None:  # if fullmatch fails match is None
    print(match.groups())

match = pattern.fullmatch("01:20:40.97")
if match is not None:
    print(match.groups())

match = pattern.fullmatch("1.01:20:40.97")
if match is not None:
    print(match.groups())

output

(None, '1', '20', '40', None)
(None, '1', '20', '40', '97')
('1', '1', '20', '40', '97')
...