Строка в datetime с дробными секундами, в Google App Engine
Мне нужно преобразовать строку в объект datetime вместе с дробными секундами. Я сталкиваюсь с различными проблемами.
Обычно я бы сделал:
>>> datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%f")
Но ошибки и старые документы показали мне, что strythime python2.5 не имеет% f...
Следя далее, кажется, что хранилище данных App Engine не любит дробные секунды. После редактирования объекта хранилища данных попытка добавить .5 в поле datetime дала мне следующую ошибку:
ValueError: unconverted data remains: .5
Я сомневаюсь, что дробные секунды не поддерживаются... так что это просто в средстве просмотра хранилища данных, правильно?
Кто-нибудь обошел эту проблему? Я хочу использовать собственные объекты datetime... Я предпочитаю не хранить отметки времени UNIX...
Спасибо!
EDIT: Спасибо Якобу Оскарсону за ссылку .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))
Ответы
Ответ 1
Синтаксический
Без поддержки формата %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
. Запрос для фракций может быть сложнее, хотя..
Ответ 2
Вся древняя история к настоящему времени, но в эти современные времена вы также можете удобно использовать dateutil
from dateutil import parser as DUp
funky_time_str = "1/1/2011 12:51:00.0123 AM"
foo = DUp.parse(funky_time_str)
print foo.timetuple()
# time.struct_time(tm_year=2011, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=51, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=-1)
print foo.microsecond
# 12300
print foo
# 2011-01-01 00:51:00.012300
dateutil
поддерживает удивительное разнообразие возможных входных форматов, которые он анализирует без строк шаблонов.