在Python中添加timedeltas

时间:2013-09-17 22:18:29

标签: python list datetime timedelta

所以我有这个清单:

[datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800)]

总计是凌晨2点。我正在尝试将这些添加到2:00时间增量,然后需要将其转换为2.0小时的字符串。作为最后的倒计时,1:30小时将是1.5小时。

2 个答案:

答案 0 :(得分:3)

天真的方法是从每个对象中取secondssum

>>> a = [datetime.timedelta(0, 1800)] * 4
>>> print sum([d.seconds for d in a])
7200
>>> print sum([d.seconds for d in a]) / 60.0 / 60.0
2.0

但这并不像Haidro的解决方案那么强大:

import operator
reduce(operator.add, a)

这会导致timedelta对象具有正确的delta,您可以随意使用它。

答案 1 :(得分:3)

在Python中使用sum函数加总任何类似数字和可添加的内容的显而易见的方法是:

>>> dts = [datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800)]
>>> sum(dts, start=datetime.timedelta(0))
datetime.timedelta(0, 9, 933279)

(对于大多数类似的类型,您甚至不需要start值,因为他们知道如何将自己添加到0timedelta显然不允许这样做,避免意外混合无量纲区间 - 例如,您不希望将timeout_in_millis添加到timedelta ...)


每当您将reduceoperator.add用于类似数字的值时,您可能做错了。

如果您没有向initial提供reduce参数,则使用空列表会出错,引发TypeError而不是返回0值。 (没有数字的总和是0;没有timedelta的总和是timedelta(0);等等。)

如果你确实提供了一个initial参数,那么它只是一个更冗长,更复杂,更慢的方式来编写sum。比较:

functools.reduce(operator.add, a, foo(0))
sum(a, foo(0))