如何解析时间

时间:2015-03-27 22:06:58

标签: python

有没有办法解析下面的时间而不使用像s.spilt()这样的hacky多次?

s = 'PT1H28M26S'

我想得到:

num_mins = 88

5 个答案:

答案 0 :(得分:5)

您可以使用regular expression

>>> match = re.search(r"PT(\d+)H(\d+)M(\d+)S", s)
>>> h, m, s = map(int, match.groups())
>>> num_mins = h * 60 + m
>>> num_mins
88

答案 1 :(得分:3)

您可以使用time.strptime函数将字符串转换为日期对象,然后只需使用hourminute获取tm_hourtm_min方法:

>>> import time
>>> t=time.strptime('PT1H28M26S', "PT%HH%MM%SS")
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=1, tm_min=28, tm_sec=26, tm_wday=0, tm_yday=1, tm_isdst=-1)

>>> t.tm_hour * 60 + t.tm_min
88

答案 2 :(得分:2)

您可以使用基本切片和字符串方法:

s = 'PT1H28M26S'
num_mins = int(s[s.find('H')-1]) * 60 + int(s[s.find('H')+1:s.find('M')]) 

答案 3 :(得分:2)

删除P,T和M,然后使用平移切片,然后使用split:

提取小时和分钟
s = 'PT1H28M26S'

hr, min = map(int, s.translate(None,"PTMS")[:-2].split("H"))
print(hr,min)
(1, 28)

如果您可能有几位数的秒数,请将它们关闭:

hr,min =  map(int,s[2:].rstrip("0123456789S")[:-1].split("H"))

有些时间表明发现是最有效的,时间最少:

In [38]: r  = re.compile(r"PT(\d+)H(\d+)M(\d+)S")

In [39]: %%timeit
   ....: match = r.search(s)
   ....: h, m, _ = map(int, match.groups())
   ....: 
100000 loops, best of 3: 3.16 µs per loop

In [40]: timeit t=time.strptime('PT1H28M2S', "PT%HH%MM%SS")
100000 loops, best of 3: 13.3 µs per loop

In [41]: timeit hr, min = map(int,s[2:].rstrip("0123456789S")[:-1].split("H"))
100000 loops, best of 3: 1.96 µs per loop
In [43]: timeit num_mins = int(s[s.find('H')-1]) * 60 +   int(s[s.find('H')+1:s.find('M')]) 
1000000 loops, best of 3: 1.54 µs per loop

答案 4 :(得分:1)

我不确定我会将拆分解决方案称为“hacky”。它不是最短的,但它很简单:

import re
HMS = [ 60, 1, 0 ]
parts = [int(x) for x in re.split('\D', s) if x != ""]
num_mins = sum([ v * u for v, u in zip(parts, HMS) ])