Разбор чч: мм в Python - PullRequest
       16

Разбор чч: мм в Python

4 голосов
/ 24 июля 2011

Иногда я получаю строку типа «02:40», указывающую 2 часа и 40 минут. Я хотел бы разобрать эту строку по количеству минут (160 в данном случае), используя Python.

Конечно, я могу разобрать строку и умножить часы на 60, но есть ли что-то в стандартной библиотеке, которая делает это?

Ответы [ 6 ]

8 голосов
/ 25 июля 2011

Лично я думаю, что простой анализ строки намного проще для чтения:

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

Ответ на основе 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
8 голосов
/ 24 июля 2011

Кроме следующего, разбор строк (или если вы хотите быть медленнее для чего-то такого простого, используйте модуль re) - это единственный способ, о котором я могу думать, если вы полагаетесь на стандартную библиотеку. TimeDelta, похоже, не подходит для этой задачи.

>>> import time
>>> x = "02:40"
>>> t = time.strptime(x, "%H:%M")
>>> minutes = t.tm_hour * 60 + t.tm_min
>>> minutes
160
4 голосов
/ 24 июля 2011

См. 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.strptime или time.strptime, которая создает объект datetime или timeиз строки со временем и другой строкой, описывающей формат.

Если вы не хотите описывать формат, используйте 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))

См. Как разобрать даты с -0400 строкой часового пояса в Python?

1 голос
/ 25 июля 2011
>>> sum(map(lambda x, y: x * y, map(int, "2:40".split(":")), [60, 1]))
160
0 голосов
/ 25 июля 2011

Есть:

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

edit: исправлено второе решение для получения минут, а не секунд

.

Простейшее решение

T = '02:40'

print int(T[0:2])*60 + int(T[3:])
0 голосов
/ 24 июля 2011

Я уверен, что вы можете представить данное время как объект TimeDelta.Оттуда я уверен, что есть простой способ представить TimeDelta в минутах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...