2011-07-24 29 views
4

有時我會得到一個像「02:40」這樣的字符串,表示2小時40分鐘。我想使用Python將該字符串解析爲分鐘數(本例中爲160)。解析Python中的hh:mm

當然,我可以解析字符串並將小時乘以60,但標準庫中是否有這樣做?

+0

不太可能。標準庫可以滿足常見的情況,在這種情況下,您可以使用代碼輕鬆解決問題。那麼爲什麼Python創作者會煩擾? – Joey

+0

你爲什麼需要它來使用std lib?由於分隔符? – JBernardo

+0

我相信,如果你在代碼中做了一些技術性的東西,而不僅僅是一行代碼,甚至有點複雜,你應該有一個功能。也許我會做一個。 –

回答

6

我個人認爲,簡單地解析字符串是更容易閱讀:

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

約翰·馬金的地圖和之和約爲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 
+0

'.split'解決方案是我最喜歡的。但是我仍然非常失望,因爲Python沒有提供分析小時字符串的函數。 –

0

我確定您可以將給定的時間表示爲TimeDelta對象。從那裏我肯定有一個簡單的方法來在幾分鐘內表示TimeDelta。

8

除了以下內容之外,字符串解析(或者如果你想更簡單一些,請使用re模塊),這是我能夠想象的唯一方法,如果你依賴標準庫。 TimeDelta似乎不適合這項任務。

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

請參閱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)) 

How to parse dates with -0400 timezone string in python?

+2

另一個不錯的日期解析器是parsedatetime:http://code.google.com/p/parsedatetime/ – carl

+0

好注意,忘記了這一點。書籤。 – agf

-3

有:

from time import strptime 
from calendar import timegm 

T = '02:40' 
t = timegm(strptime('19700101'+T,'%Y%m%d%H:%M')) 
print t 

但是這真的不是畜生結石好?

奇異溶液,不需要導入功能:

T = '02:40' 
exec('x = %s' % T.replace(':','*60+')) 
print x 

編輯:校正後的第二溶液中以獲得分鐘,不秒

簡單的解決方案

T = '02:40' 

print int(T[0:2])*60 + int(T[3:]) 
+2

-1使用exec是在這種情況下的poxxor –

+0

@John Machin _「有時候我會得到一個像」02:40「這樣的字符串,表示......」_我看不到其他的「上下文」。這是相當微小的理由downvote。我希望你更多地解釋,而不是喜歡用複雜的詞表達事情,我不明白,我不在freedictionary.com找到 – eyquem

+0

而你的第一個例子給我的電腦9600,而不是預期的160。 – Blair

1
>>> sum(map(lambda x, y: x * y, map(int, "2:40".split(":")), [60, 1])) 
160