Подтвердить что ты не робот

Как я могу выполнить divison на datetime.timedelta в python?

Я хотел бы иметь возможность сделать следующее:

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. Есть ли способ, которым я могу реализовать divison для timedeltas?

Изменить: Похоже, что это было добавлено в Python 3.2 (спасибо rincewind!): http://bugs.python.org/issue2706 p >

4b9b3361

Ответ 1

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

EDIT (снова): поэтому вы не можете назначить 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, по крайней мере, в вашем коде.

Ответ 2

Разделение и умножение на целые числа, по-видимому, работают из коробки:

>>> from datetime import timedelta
>>> timedelta(hours=6)
datetime.timedelta(0, 21600)
>>> timedelta(hours=6) / 2
datetime.timedelta(0, 10800)

Ответ 3

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

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