строка до даты и времени с долями секунды в Google App Engine - PullRequest
14 голосов
/ 04 августа 2010

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

Обычно я делал бы:

>>> datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%f")

Но ошибки и старые документы показали мне, что strptime в python2.5 не имеет% f ...

При дальнейшем исследовании кажется, что хранилище данных App Engine не любит доли секунды.После редактирования сущности хранилища данных попытка добавить .5 в поле datetime вызвала следующую ошибку:

ValueError: unconverted data remains: .5

Я сомневаюсь, что дробные секунды не поддерживаются ... так что это только в средстве просмотра хранилища данных,верно?

Кто-нибудь обошел эту проблему?Я хочу использовать нативные объекты даты и времени ... Я скорее не храню метки времени UNIX ...

Спасибо!


РЕДАКТИРОВАТЬ: Спасибо Джейкобу Оскарсону за .replace (...) tip!

Следует помнить одну вещь: проверять длину 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))

Ответы [ 2 ]

11 голосов
/ 06 августа 2010

Синтаксический анализ

Без поддержки формата %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.Запрашивать дроби может быть сложнее, хотя ..

3 голосов
/ 01 октября 2014

Вся древняя история к настоящему времени, но в эти современные времена вы также можете удобно использовать 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 поддерживает удивительное разнообразие возможных форматов ввода, которые он анализирует без строк шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...