簡體   English   中英

在Python中解析hh:mm

[英]Parsing hh:mm in Python

有時我得到一個像“02:40”的字符串,表示2小時40分鍾。 我想使用Python將該字符串解析為分鍾數(在本例中為160)。

當然,我可以解析字符串並將小時數乘以60,但是標准庫中有什么東西可以做到這一點嗎?

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

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

就個人而言,我認為簡單地解析字符串更容易閱讀:

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

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

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

請參閱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 ,它從帶有時間的字符串和描述格式的另一個字符串創建datetime timetime對象。

如果您不想描述格式,請使用dateutilhttp: 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時區字符串解析日期?

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

我確信你可以將給定時間表示為TimeDelta對象。 從那里我相信有一種簡單的方法可以在幾分鍾內代表TimeDelta。

有:

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:])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM