【问题标题】:Why can't I divide a datetime.timedelta by a float?为什么我不能将 datetime.timedelta 除以浮点数?
【发布时间】:2012-05-17 12:52:39
【问题描述】:
>>> 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'

有人知道只允许时间增量可以被整数整除的原因吗?

【问题讨论】:

  • @Woobie -- 你是对的。我没试过……

标签: python datetime timedelta


【解决方案1】:

其实很简单 - 它是一个缺失的功能。

这样做的好处是它已作为一个功能添加到 Python 3.x 中。

注意2.x3.x中支持的运算表的区别。

【讨论】:

  • 谢谢。当它不起作用时,我只是被吓倒了,我想知道它背后是否有任何理性。由于它适用于 python 3.x,我假设你是对的,这只是一个疏忽。谢谢。
  • 好吧,放下它,然后再试一次! *轻笑。
【解决方案2】:

非常有趣——我原以为这也能奏效。我刚刚用 Python 2.x 中的一些示例/文档测试编写了一个函数。也发布为ActiveState recipe

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()

【讨论】:

猜你喜欢
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2021-05-14
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
相关资源
最近更新 更多