我正在尝试使用datetime.strptime从两个字符串中获取单个日期时间。
时间很简单(例如,下午8: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)。有什么想法吗?
答案 0 :(得分:2)
如果您想从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)
答案 1 :(得分:1)
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'>
由于 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倍。如果有很多这样的转换要执行
,这可能会很有趣答案 2 :(得分:0)
使用格式字符串无法做到这一点。但是,如果小时无关紧要,您可以在第一个示例中从网址获取该小时,然后拨打theDateTime.replace(hour=hour_from_a_different_source)
。
这样您就不必进行任何额外的解析。