Выяснение продолжительности события в Python - PullRequest
2 голосов
/ 05 марта 2010

Это очень нубистский вопрос, поэтому я заранее извиняюсь!

У меня есть две отметки времени для начала и окончания мероприятия. Они хранятся в формате datetime.datetime в UTC. Что мне нужно сделать, так это выяснить продолжительность мероприятия.

Я пытался вычесть одно из другого, но получил ошибку:

Traceback (most recent call last):
02.
File '/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py', line 509, in __call__
03.
handler.post(*groups)
04.
File '/base/data/home/apps/.../3.340324527833140591/main.py', line 441, in post
05.
call_record.Duration = call_record.CallStartTime - call_record.CallEndTime
06.
File '/base/python_lib/versions/1/google/appengine/ext/db/__init__.py', line 472, in __set__
07.
value = self.validate(value)
08.
File '/base/python_lib/versions/1/google/appengine/ext/db/__init__.py', line 2322, in validate
09.
(self.name, self.data_type.__name__))
10.
BadValueError: Property Duration must be a datetime
11.

CallStartTime, CallEndTime и Duration являются типами db.DateTimeProperty () в GAE.

Раньше я использовал django timesince для отображения продолжительности, но мне нужно сделать некоторые дополнительные вычисления, чтобы выяснить avg. продолжительность событий.

Будем очень благодарны за любые предложения или указатели на то, что может помочь дополнительная информация!

Ответы [ 3 ]

5 голосов
/ 05 марта 2010

Вычитание одного datetime из другого даст вам timedelta. Вы можете использовать это для создания другого datetime, если вам нужно, добавив его или вычтя из другого datetime объекта.

Как вы можете представить длительность с одним datetime объектом, хотя?

1 голос
/ 05 марта 2010

Разница двух datetime.datetime объектов - это datetime.timedelta объект:

In [2]: t1=datetime.datetime.now()

In [3]: t1
Out[3]: datetime.datetime(2010, 3, 5, 12, 34, 6, 402507)

In [4]: t2=datetime.datetime.now()

In [5]: dt=t2-t1

In [6]: dt
Out[6]: datetime.timedelta(0, 8, 911129)

timedelta s имеют атрибуты days, seconds и microseconds.

In [7]: dt.seconds
Out[7]: 8

Если timedelta охватывает продолжительность дней, то вам также понадобятся дни и секунды:

In [8]: dt.days*(3600*24)+dt.seconds
Out[8]: 8

Подробнее timedelta см. http://docs.python.org/library/datetime.html#timedelta-objects

.
0 голосов
/ 06 марта 2010

Для подобных вещей я всегда использую time.time (), который возвращает хороший float, а затем в основном форматирует его примерно так:

import time

t1 = time.time()

someLongTakingFunction()

print "Function took %.2f" % (time.time() - t1)

Это хорошо для быстрых и грязных проверок, но, предположительно, существуют более эффективные способы измерения производительности. Хотя 90% времени это работает для меня все время.

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