Мне нужно преобразовать строку в объект datetime вместе с дробным секунд. Я сталкиваюсь с различными проблемами.
Обычно я делал бы:
>>> datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%f")
Но ошибки и старые документы показали мне, что python2.5 ' s strptime не имеет% f ...
Следующее исследование показывает, что хранилище данных App Engine не любит доли секунды. После редактирования объекта хранилища данных при попытке добавить .5 к полю datetime я получил следующую ошибку:
ValueError: unconverted data remains: .5
Я сомневаюсь, что дробные секунды не поддерживаются ... так что это только в средстве просмотра хранилища данных, верно?
кто-нибудь обходил эту проблему? Я хочу использовать нативные объекты datetime ... Я скорее не храню метки времени UNIX ...
Спасибо!
РЕДАКТИРОВАТЬ: Спасибо Джейкобу Оскарсону за подсказку .replace (...)!
иметь в виду, проверять длину nofrag перед подачей. Различные источники используют различную точность для секунд.
Вот быстрая функция для тех, кто ищет что-то подобное:
def strptime(val):
if '.' not in val:
return datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S")
nofrag, frag = val.split(".")
date = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
frag = frag[:6] # truncate to microseconds
frag += (6 - len(frag)) * '0' # add 0s
return date.replace(microsecond=int(frag))
Синтаксический анализ
Без поддержки формата % f
для datetime.datetime.strptime ()
вы все равно можете достаточно легко ввести его в datetime.datetime
] (случайный выбор значения для вашего val
здесь) с использованием datetime.datetime.replace ()
), протестирован в 2.5.5:
>>> val = '2010-08-06T10:00:14.143896'
>>> nofrag, frag = val.split('.')
>>> nofrag_dt = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
>>> dt = nofrag_dt.replace(microsecond=int(frag))
>>> dt
datetime.datetime(2010, 8, 6, 10, 0, 14, 143896)
Теперь у вас есть объект datetime.datetime
.
Сохранение
Дальнейшее чтение в http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#datetime
Я не вижу упоминания о том, что дроби не поддерживаются , так что да, вероятно, это только программа просмотра хранилища данных. Документы указывают непосредственно на документацию модуля Python 2.5.2 для datetime
, и он поддерживает дроби, но не директиву синтаксического анализа % f
для strptime
. Однако запрос дробей может оказаться более сложной задачей ..