Как я могу выполнить деление на datetime.timedelta в Python? - PullRequest
22 голосов
/ 15 мая 2009

Я бы хотел сделать следующее:

num_intervals = (cur_date - previous_date) / interval_length

или

print (datetime.now() - (datetime.now() - timedelta(days=5))) 
      / timedelta(hours=12)
# won't run, would like it to print '10'

но операция деления на timedeltas не поддерживается. Есть ли способ, которым я могу реализовать деление для timedeltas?

Редактировать: Похоже, это было добавлено в Python 3.2 (спасибо rincewind!): http://bugs.python.org/issue2706

Ответы [ 3 ]

11 голосов
/ 15 мая 2009

Деление и умножение на целые числа, кажется, работает из коробки :

>>> from datetime import timedelta
>>> timedelta(hours=6)
datetime.timedelta(0, 21600)
>>> timedelta(hours=6) / 2
datetime.timedelta(0, 10800)
10 голосов
/ 15 мая 2009

Конечно, просто конвертируйте в количество секунд (минуты, миллисекунды, часы, выбирайте единицы измерения) и делите.

РЕДАКТИРОВАТЬ (снова): поэтому вы не можете присвоить timedelta.__div__. Попробуйте это, тогда:

divtdi = datetime.timedelta.__div__
def divtd(td1, td2):
    if isinstance(td2, (int, long)):
        return divtdi(td1, td2)
    us1 = td1.microseconds + 1000000 * (td1.seconds + 86400 * td1.days)
    us2 = td2.microseconds + 1000000 * (td2.seconds + 86400 * td2.days)
    return us1 / us2 # this does integer division, use float(us1) / us2 for fp division

И включить это в предложение Нади:

class MyTimeDelta:
    __div__ = divtd

Пример использования:

>>> divtd(datetime.timedelta(hours = 12), datetime.timedelta(hours = 2))
6
>>> divtd(datetime.timedelta(hours = 12), 2)
datetime.timedelta(0, 21600)
>>> MyTimeDelta(hours = 12) / MyTimeDelta(hours = 2)
6

и т.д.. Конечно, вы можете даже назвать (или псевдоним) свой пользовательский класс timedelta, чтобы он использовался вместо реального timedelta, по крайней мере, в вашем коде.

4 голосов
/ 15 мая 2009

Вы можете переопределить оператор деления следующим образом:

class MyTimeDelta(timedelta):
     def __div__(self, value):
          # Dome something about the object
...