在Python中添加时间增量
因此,我有以下清单:在Python中添加时间增量,python,list,datetime,timedelta,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小时作为最后的倒计时。最简单的方法是从每个对象中提取秒数,然后对它们求和 >>> a = [da
[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小时作为最后的倒计时。最简单的方法是从每个对象中提取
秒数
,然后对它们求和
>>> 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
但这并不像海德罗的解决方案那样强大:
import operator
reduce(operator.add, a)
这将产生一个具有正确增量的
timedelta
对象,您可以随意使用该对象。在Python中,对任何类似于数字且可添加的数字求和的明显方法是使用以下函数:
>>> 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
值,因为它们知道如何将自己添加到0
timedelta
显式地不允许这样做,以避免意外地混合无量纲间隔,例如,您不想将timeout\u in_millis
添加到timedelta
。)
无论何时使用
reduce
和运算符。为类似数字的值添加
,都可能是做错了
如果不为reduce
提供initial
参数,它将使用空列表执行错误操作,引发TypeError
而不是返回0
值。(无数字之和为0;无timedelta
s之和为timedelta(0)
;等等)
如果您确实提供了一个初始
参数,那么它只是一种更详细、更复杂、更慢的编写求和
的方法。比较:
functools.reduce(operator.add, a, foo(0))
sum(a, foo(0))
导入操作符;减少(operator.add,YourList)
此问题不应关闭。。。哈哈。求和.seconds
是有风险的。你会减少小时和微秒,所以不包括它们是一个很大的假设。要么使用.total_seconds()
(python 2.7),要么计算出小时/微秒。哈哈!接线员太棒了,你最好走那条路线。碰巧你怎么能如此有效地记住所有这些不同的模块?@Matthew-Heh,嗯,操作符的解决方案是我的,所以我想我会回答这个问题。在回答问题的时候,我学到了很多东西,比如我以前从未见过的内置函数或者很棒的模块,比如这个。操作符
special没有什么特别之处,它只是其他东西的简化版本。例如,operator.add(a,b)
与a+b
相同。这两个版本都是多余的。您不必在d.total_seconds()
值上调用sum
,只要直接在值上调用即可。当您可以使用内置的时,您不必使用reduce
手动构建sum
。