Разбор строк datetime с микросекундами

У меня есть текстовый файл с большим количеством строк datetime в isoformat. Строки аналогичны следующим образом:

'2009-02-10 16: 06: 52.598800'

Эти строки были сгенерированы с помощью str(datetime_object). Проблема состоит в том, что по какой-то причине str(datetime_object) генерирует другой формат, когда объект datetime имеет микросекунды, установленные на ноль, и некоторые строки выглядят следующим образом:

'2009-02-10 16:06:52'

Как я могу разобрать эти строки и преобразовать их в объект datetime?

Очень важно получить все данные в объекте, включая микросекунды.

Мне нужно использовать Python 2.5, я обнаружил, что директива format %f для микросекунд не существует в 2.5.

Ответы

Ответ 1

В качестве альтернативы:

from datetime import datetime

def str2datetime(s):
    parts = s.split('.')
    dt = datetime.strptime(parts[0], "%Y-%m-%d %H:%M:%S")
    return dt.replace(microsecond=int(parts[1]))

Использование strptime для анализа строки даты/времени (так что не нужно придумывать угловые случаи для регулярного выражения).

Ответ 2

Используйте модуль dateutil. Он поддерживает гораздо более широкий диапазон форматов даты и времени, чем встроенные в Python.

Вам понадобится easy_install dateutil для следующего кода:

from dateutil.parser import parser

p = parser()
datetime_with_microseconds = p.parse('2009-02-10 16:06:52.598800')
print datetime_with_microseconds.microsecond

приводит к:

598799

Ответ 3

Кто-то уже подал ошибку с этой проблемой: Issue 1982. Поскольку вам нужно это для работы с python 2.5, вы должны разобрать значение вручную, а затем манипулировать объектом datetime.

Ответ 4

Это может быть не лучшее решение, но вы можете использовать регулярное выражение:

m = re.match(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(?:\.(\d{6}))?', datestr)
dt = datetime.datetime(*[int(x) for x in m.groups() if x])