如何在Python中对datetime.timedelta进行除法运算?

26 投票
3 回答
23265 浏览
提问于 2025-04-15 11:35

我想要实现以下功能:

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'

但是,时间差的除法操作是不支持的。我有没有办法为时间差实现除法呢?

补充:看起来这个功能是在Python 3.2中添加的(感谢rincewind!):http://bugs.python.org/issue2706

3 个回答

4

你可以这样重写除法运算符:

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

用整数进行除法和乘法运算似乎是直接可以使用的,没什么复杂的:

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

当然,可以把时间转换成秒(或者分钟、毫秒、小时,随你选择单位),然后进行除法运算。

编辑(再次更新):所以你不能直接给 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

然后把这个和nadia的建议结合起来:

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 来替代真正的 timedelta

撰写回答