Конвертировать список строк или строковое поле SQL в datetime

Рейтинг: 0Ответов: 2Опубликовано: 18.04.2023

Получаю из postgresql поле строк, в виде списка строк, которые выглядят как дата-время:

2022-12-29 01:17:59.274000

Надо получить список/массив/pd.Series из объектов datetime.datetime.

Не было бы проблем, если бы среди этих строк не попадались бы такие:

2022-12-29 01:17:59

И когда я пытаюсь применить:

datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S.%f')

или аналогично для Pandas:

pd.to_datetime(df.date_time, format='%Y-%m-%d %H:%M:%S.%f')

То получаю ValueError, о том, что для .%f не найдено значение.

Я написал костыль:

def convert_str_date(x):
    return datetime.datetime.strptime(x+'.0' if '.' not in x else x, '%Y-%m-%d %H:%M:%S.%f')
list_date_time = list(map(convert_str_date, list_str)

Что-то такое же можно и для Pandas написать и применить с .apply.

Потом я решил, что, возможно, есть способ сразу получать из SQL сконвертированные данные, но я нашел только to_date/to_time, которые отдельно конвертят дату и отдельно время, а как это сделать вместе - не нашел.

Итак, вопросы:

  1. Есть ли способ, не писать костыль, который будет добавлять '.0'. Возможно, есть какой-то прием в шаблонах datetime, типа как в регулярных выражениях.
  2. Есть ли способ сразу получить из SQL вот такие данные в нужном формате?

Благодарю!

Ответы

▲ 0
  1. Да есть. Написать другой костыль с использованием регулярных выражений))
  2. Попробуйте в SQL запросе использовать что-то вроде to_char(your_datetime_column, 'YYYY-MM-DD HH24:MI:SS.US')
▲ 0

Есть частичный ответ на первый вопрос, есть решение для Pandas:

pd.to_datetime(df.date_time, format='mixed')

Остается вопрос для базового питона.

Есть ответ и на второй вопрос:

SELECT date_time_field::timestamp from table

UPD. Есть вариант для стандартных библиотек, но он такой медленный, что даже не знаю, стоит ли указывать.

from dateutil import parser
date_time_list = list(map(parser.parse, list_str))

Работает в 7 раз медленнее, чем мой костыльный способ.

Пока по скорости выигрывает запрос к postgres с конвертацией. Вариант с Pandas в два раза медленнее. Костыльный вариант в 4 раза медленнее чем Pandas.

Все еще жду хорошего решения для стандартных библиотек.