Получение даты из сложной строки в Python

Я пытаюсь получить одну дату и время из двух строк, используя datetime.strptime.

Время довольно простое (например, 20:53), поэтому я могу сделать что-то вроде:

theTime = datetime.strptime(givenTime, "%I:%M%p")

Однако строка содержит больше, чем просто дату, это ссылка в формате, похожем на http://site.com/?year=2011&month=10&day=5&hour=11. Я знаю, что мог бы сделать что-то вроде:

theDate = datetime.strptime(givenURL, "http://site.com/?year=%Y&month=%m&day=%d&hour=%H")

но я не хочу получать этот час по ссылке, так как он извлекается из другого места. Есть ли способ поместить фиктивный символ (например,% x или что-то в этом роде), чтобы он служил гибким пространством для этой последней переменной?

В конце концов, я представляю себе одну строку, похожую на:

theDateTime = datetime.strptime(givenURL + givenTime, ""http://site.com/?year=%Y&month=%m&day=%d&hour=%x%I:%M%p")

(хотя, очевидно, %x не будет использоваться). Любые идеи?


person alukach    schedule 15.08.2011    source источник


Ответы (3)


Подумайте, что если вы хотите просто пропустить время из URL-адреса, вы можете использовать разделение, например, следующим образом:

givenURL = 'http://site.com/?year=2011&month=10&day=5&hour=11'
pattern = "http://site.com/?year=%Y&month=%m&day=%d"
theDate = datetime.strptime(givenURL.split('&hour=')[0], pattern)

Так что не уверен, что правильно Вас понял, но:

givenURL = 'http://site.com/?year=2011&month=10&day=5&hour=11'
datePattern = "http://site.com/?year=%Y&month=%m&day=%d"
timePattern = "&time=%I:%M%p"

theDateTime = datetime.strptime(givenURL.split('&hour=')[0] + '&time=' givenTime, datePattern + timePattern)
person Artsiom Rudzenka    schedule 15.08.2011

import datetime
import re

givenURL  = 'http://site.com/?year=2011&month=10&day=5&hour=11'
givenTime = '08:53PM'

print ' givenURL == ' + givenURL
print 'givenTime == ' + givenTime

regx = re.compile('year=(\d\d\d\d)&month=(\d\d?)&day=(\d\d?)&hour=\d\d?')
print '\nmap(int,regx.search(givenURL).groups()) ==',map(int,regx.search(givenURL).groups())

theDate = datetime.date(*map(int,regx.search(givenURL).groups()))
theTime = datetime.datetime.strptime(givenTime, "%I:%M%p")

print '\ntheDate ==',theDate,type(theDate)
print '\ntheTime ==',theTime,type(theTime)


theDateTime = theTime.replace(theDate.year,theDate.month,theDate.day)
print '\ntheDateTime ==',theDateTime,type(theDateTime)

результат

 givenURL == http://site.com/?year=2011&month=10&day=5&hour=11
givenTime == 08:53PM

map(int,regx.search(givenURL).groups()) == [2011, 10, 5]

theDate == 2011-10-05 <type 'datetime.date'>

theTime == 1900-01-01 20:53:00 <type 'datetime.datetime'>

theDateTime == 2011-10-05 20:53:00 <type 'datetime.datetime'>

Изменить 1

Поскольку strptime() работает медленно, я улучшил свой код, чтобы устранить его.

from datetime import datetime
import re
from time import clock


n = 10000

givenURL  = 'http://site.com/?year=2011&month=10&day=5&hour=11'
givenTime = '08:53AM'

# eyquem
regx = re.compile('year=(\d\d\d\d)&month=(\d\d?)&day=(\d\d?)&hour=\d\d? (\d\d?):(\d\d?)(PM|pm)?')
t0 = clock()
for i in xrange(n):
    given = givenURL + ' ' + givenTime
    mat = regx.search(given)
    grps = map(int,mat.group(1,2,3,4,5))
    if mat.group(6):
        grps[3] += 12 # when it is PM/pm, the hour must be augmented with 12
    theDateTime1 = datetime(*grps)
print clock()-t0,"seconds   eyquem's code"
print theDateTime1


print

# Artsiom Rudzenka
dateandtimePattern = "http://site.com/?year=%Y&month=%m&day=%d&time=%I:%M%p"
t0 = clock()
for i in xrange(n):
    theDateTime2 = datetime.strptime(givenURL.split('&hour=')[0] + '&time=' + givenTime, dateandtimePattern)
print clock()-t0,"seconds   Artsiom's code"
print theDateTime2

print
print theDateTime1 == theDateTime2

результат

0.460598763251 seconds   eyquem's code
2011-10-05 08:53:00

2.10386180366 seconds   Artsiom's code
2011-10-05 08:53:00

True

Мой код в 4,5 раза быстрее. Это может быть интересно, если нужно выполнить много таких преобразований.

person eyquem    schedule 15.08.2011
comment
Очень впечатляет, но, к сожалению, ваш метод немного менее разборчив, чем другой метод, и поэтому кто-то с моим уровнем навыков, вероятно, немного запутается в нем. Спасибо за вклад, довольно крутой способ сделать это. - person alukach; 16.08.2011

Невозможно сделать это со строкой формата. Однако, если час не имеет значения, вы можете получить его по URL-адресу, как в первом примере, а затем вызвать theDateTime.replace(hour=hour_from_a_different_source).

Таким образом, вам не нужно делать дополнительный разбор.

person Brent Newey    schedule 15.08.2011