Почему я не могу разделить datetime.timedelta на число с плавающей запятой?

>>> import datetime
>>> now1 = datetime.datetime.now()
>>> now2 = datetime.datetime.now()
>>> timedelta = now2-now1
>>> halfdt = timedelta/2  #This works just fine
>>> halfdt = timedelta/2. #TypeError: unsupported operand type(s) for /: 'datetime.timedelta' and 'float'

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


person mgilson    schedule 17.05.2012    source источник
comment
@Woobie - ты прав. я такое не пробовала...   -  person mgilson    schedule 17.05.2012


Ответы (2)


Это на самом деле довольно просто - это была отсутствующая функция.

Положительным моментом этого является то, что он был добавлен как функция в Python 3.x.

Обратите внимание на разницу между поддерживаемыми операционными таблицами в 2.x и 3.x.

person Gareth Latty    schedule 17.05.2012
comment
Спасибо. Я был просто поражен, когда это не сработало, и мне было интересно, есть ли за этим какая-то логика. Поскольку это работает в python 3.x, я предполагаю, что вы правы, и это был просто недосмотр. Спасибо. - person mgilson; 17.05.2012
comment
Что ж, заткнись и попробуй еще раз! *смех. - person jpaugh; 17.05.2012

Очень интересно - я ожидал, что это тоже сработает. Я только что написал функцию с некоторыми примерами/доктестами, которая делает это в Python 2.x. Также публикуется как рецепт ActiveState. :

import datetime

def divide_timedelta(td, divisor):
    """Python 2.x timedelta doesn't support division by float, this function does.

    >>> td = datetime.timedelta(10, 100, 1000)
    >>> divide_timedelta(td, 2) == td / 2
    True
    >>> divide_timedelta(td, 100) == td / 100
    True
    >>> divide_timedelta(td, 0.5)
    datetime.timedelta(20, 200, 2000)
    >>> divide_timedelta(td, 0.3)
    datetime.timedelta(33, 29133, 336667)
    >>> divide_timedelta(td, 2.5)
    datetime.timedelta(4, 40, 400)
    >>> td / 0.5
    Traceback (most recent call last):
      ...
    TypeError: unsupported operand type(s) for /: 'datetime.timedelta' and 'float'

    """
    # timedelta.total_seconds() is new in Python version 2.7, so don't use it
    total_seconds = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 1e6) / 1e6
    divided_seconds = total_seconds / float(divisor)
    return datetime.timedelta(seconds=divided_seconds)

if __name__ == '__main__':
    import doctest
    doctest.testmod()
person Ben Hoyt    schedule 17.05.2012
comment
Стоит отметить, что это отличается от функциональности Python 3.x, насколько я могу судить, поскольку Python 3.x делает «Дельта, деленная на число с плавающей запятой или целое число. Результат округляется до ближайшего кратного timedelta.разрешение с помощью округления от половины до четного.', а в вашем случае разрешение не используется, так что это не совсем подходящая замена. Однако все еще полезно, так что +1. - person Gareth Latty; 18.05.2012
comment
Честное слово - я не думаю, что вы могли бы предложить правки, чтобы исправить это? (Предполагая, что это достаточно просто - я думаю, что это достаточно пограничный случай, который, вероятно, не имеет большого значения.) - person Ben Hoyt; 18.05.2012