Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中添加时间增量_Python_List_Datetime_Timedelta - Fatal编程技术网

在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