Защо не мога да разделя datetime.timedelta с float?

>>> 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 прави 'Делта, разделена на float или int. Резултатът се закръгля до най-близкото кратно на timedelta.resolution с помощта на round-half-to-even.', а вашият не използва разделителната способност, така че не е съвсем подходяща замяна. Все пак е полезно, така че +1. - person Gareth Latty; 18.05.2012
comment
Честно решение - предполагам, че не бихте могли да предложите редакции, за да поправите това? (Ако приемем, че е достатъчно просто -- мисля, че това е достатъчно краен случай, че вероятно няма голямо значение.) - person Ben Hoyt; 18.05.2012