在Python中解析hh:mm格式

8 投票
6 回答
13254 浏览
提问于 2025-04-16 22:11

有时候我会得到一个像“02:40”这样的字符串,它表示2小时40分钟。我想用Python把这个字符串转换成分钟数(在这个例子中是160分钟)。

当然,我可以解析这个字符串,然后把小时乘以60,但标准库里有没有什么工具可以直接做到这一点呢?

6 个回答

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.strptimetime.strptime,它们可以从一个包含时间的字符串和一个描述格式的字符串中创建一个 datetimetime 对象。

如果你不想自己描述格式,可以使用 dateutil,这个库可以帮你处理日期和时间,链接是 http://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))

你可以查看这个链接了解更多:如何在Python中解析带有-0400时区字符串的日期?

11

除了下面提到的,字符串解析(或者如果你想让这个简单的事情变得更慢一点,可以使用 re 模块)是我能想到的唯一方法,如果你只依赖标准库的话。TimeDelta 似乎不太适合这个任务。

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

我个人觉得,直接解析字符串要简单得多,读起来也更容易:

>>> s = '02:40'
>>> int(s[:-3]) * 60 + int(s[-2:])
160

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

>>> s = '2:40'
>>> int(s[:-3]) * 60 + int(s[-2:])
160

你也可以使用 split() 函数:

>>> hours, minutes = s.split(':')
>>> int(hours) * 60 + int(minutes)
160

或者用 map() 函数把这些部分转换成整数:

>>> hours, minutes = map(int, s.split(':'))
>>> hours * 60 + minutes
160

速度

使用 timeit 模块测试显示,这种方法比这里提到的其他方法要快:

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

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

使用 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

约翰·马钦的 map 和 sum 方法大约慢 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

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

>>> 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

撰写回答