在Python中解析hh:mm

Ram*_*hum 4 python parsing calendar

有时我得到一个像"02:40"的字符串,表示2小时40分钟.我想使用Python将该字符串解析为分钟数(在本例中为160).

当然,我可以解析字符串并将小时数乘以60,但标准库中有什么东西可以做到这一点吗?

小智 9

除了以下内容之外,re如果您依赖标准库,那么我可以想到的唯一方法就是解析字符串(或者如果您想要更简单,那么使用模块).TimeDelta似乎不适合这项任务.

>>> import time
>>> x = "02:40"
>>> t = time.strptime(x, "%H:%M")
>>> minutes = t.tm_hour * 60 + t.tm_min
>>> minutes
160
Run Code Online (Sandbox Code Playgroud)


Bla*_*air 8

就个人而言,我认为简单地解析字符串更容易阅读:

>>> s = '02:40'
>>> int(s[:-3]) * 60 + int(s[-2:])
160
Run Code Online (Sandbox Code Playgroud)

请注意,使用负索引意味着它将在小时内处理没有前导零的字符串:

>>> s = '2:40'
>>> int(s[:-3]) * 60 + int(s[-2:])
160
Run Code Online (Sandbox Code Playgroud)

你也可以使用这个split()功能:

>>> hours, minutes = s.split(':')
>>> int(hours) * 60 + int(minutes)
160
Run Code Online (Sandbox Code Playgroud)

或者使用该map()函数将片段转换为整数:

>>> hours, minutes = map(int, s.split(':'))
>>> hours * 60 + minutes
160
Run Code Online (Sandbox Code Playgroud)

速度

使用该timeit模块表明它也比这里提出的其他方法更快:

>>> import timeit
>>> parsetime = timeit.timeit("mins = int(s[:-3]) * 60 + int(s[-2:])", "s='02:40'", number=100000) / 100000
>>> parsetime
9.018449783325196e-06
Run Code Online (Sandbox Code Playgroud)

split()方法有点慢:

>>> splittime = timeit.timeit("hours,minutes = s.split(':'); mins=int(hours)*60 + int(minutes)", "s='02:40'", number=100000)/100000
>>> splittime
1.1217889785766602e-05
>>> splittime/parsetime
1.2438822697120402
Run Code Online (Sandbox Code Playgroud)

map()再次使用慢一点:

>>> splitmaptime = timeit.timeit("hours,minutes = map(int, s.split(':')); mins=hours*60 + minutes", "s='02:40'", number=100000)/100000
>>> splitmaptime
1.3971350193023682e-05
>>> splitmaptime/parsetime
1.5491964282881776
Run Code Online (Sandbox Code Playgroud)

John Machin的地图和总和大约慢2.4倍:

>>> summaptime = timeit.timeit('mins=sum(map(lambda x, y: x * y, map(int, "2:40".split(":")), [60, 1]))', "s='02:40'", number=100000) / 100000
>>> summaptime
2.1276121139526366e-05
>>> summaptime/parsetime
2.43
Run Code Online (Sandbox Code Playgroud)

strptime()基于Chrono Kitsune的答案慢了十倍:

>>> strp = timeit.timeit("t=time.strptime(s, '%H:%M');mins=t.tm_hour * 60 + t.tm_min", "import time; s='02:40'", number=100000)/100000
>>> strp
9.0362770557403569e-05
>>> strp/parsetime
10.019767557444432
Run Code Online (Sandbox Code Playgroud)


agf*_*agf 5

请参阅http://webcache.googleusercontent.com/search?q=cache:EAuL4vECPBEJ:docs.python.org/library/datetime.html+python+datetime&hl=en&client=firefox-a&gl=us&strip=1,因为主要的 Python 站点是有问题。

您想要的函数是datetime.strptimeor ,它从一个带有时间的字符串和另一个描述格式的字符串time.strptime创建一个datetimeor对象。time

如果您不想描述格式,请使用dateutilhttp://labix.org/python-dateutil 。

from dateutil.parser import parse
>>> d = parse('2009/05/13 19:19:30 -0400')
>>> d
datetime.datetime(2009, 5, 13, 19, 19, 30, tzinfo=tzoffset(None, -14400))
Run Code Online (Sandbox Code Playgroud)

请参阅如何在 python 中解析带有 -0400 时区字符串的日期?

  • 另一个不错的日期解析器是 parsedatetime:http://code.google.com/p/parsedatetime/ (2认同)