Краткая дата ASCII в десятичную дату

Я написал скрипт для чтения даты в формате ASCII типа «Вторник, 18 ноября, 19:23:17 2014» и преобразования ее в десятичную дату для построения графика. Мои две строки кода работают, но они кажутся запутанными. Мне не удалось найти библиотечную функцию, выполняющую это напрямую, и я думаю, что что-то упускаю; должен быть способ сделать это в сжатой форме. Любое предложение?

import time, datetime
from matplotlib import dates
b = time.strptime('Tue Nov 18 19:23:17 2014')
d = dates.date2num(datetime.datetime(b[0],b[1],b[2],b[3],b[4],b[5]))
print d
#this code results in 735555.807836

#Simplified code incorporating suggestion by Toni_W
from matplotlib import dates
from dateutil.parser import parse
dates.date2num(parse('Tue Nov 18 19:23:17 2014'))

person gciriani    schedule 06.01.2015    source источник
comment
Вы можете использовать формулу для прямого перехода от time к float, но она точно не будет лаконичной.   -  person Mark Ransom    schedule 06.01.2015
comment
Как вы относитесь к часовым поясам? Или ваш ввод предполагается в формате UTC?   -  person ghoti    schedule 06.01.2015
comment
@Toni_W, спасибо: так что в основном мой код упрощается до одной строки: date.date2num(parse('Вторник, 18 ноября, 19:23:17 2014'))   -  person gciriani    schedule 07.01.2015
comment
@ghoti Я имею дело только с одним конкретным временем, без учета часовых поясов.   -  person gciriani    schedule 07.01.2015


Ответы (1)


Разве это не то, что вам нужно?

Анализ даты и времени в Python..?

Как предложил @TimPietzcker, пакет dateutil - это то, что нужно, он правильно и автоматически обрабатывает первые 3 формата:

>>> from dateutil.parser import parse
>>> parse("Fri Sep 25 18:09:49 -0500 2009")
datetime.datetime(2009, 9, 25, 18, 9, 49, tzinfo=tzoffset(None, -18000))
>>> parse("2008-06-29T00:42:18.000Z")
datetime.datetime(2008, 6, 29, 0, 42, 18, tzinfo=tzutc())
>>> parse("2011-07-16T21:46:39Z")
datetime.datetime(2011, 7, 16, 21, 46, 39, tzinfo=tzutc())

Формат unixtime, кажется, подходит, но, к счастью, стандартный datetime.datetime подходит для этой задачи:

>>> from datetime import datetime
>>> datetime.utcfromtimestamp(float("1294989360"))
datetime.datetime(2011, 1, 14, 7, 16)

Из этого довольно легко сделать функцию, которая обрабатывает все 4 формата:

from dateutil.parser import parse
from datetime import datetime

def parse_time(s):
    try:
        ret = parse(s)
    except ValueError:
        ret = datetime.utcfromtimestamp(s)
    return ret
person Marie    schedule 06.01.2015