总结字典中的所有时间增量值

sum up all the time delta values in a dictionary

我有一本包含时间增量值的字典。

{1: Timedelta('0 days 01:44:39'),
 2: Timedelta('0 days 02:34:01'),
 3: Timedelta('0 days 00:49:15'),
 4: Timedelta('0 days 01:13:26'),
 5: Timedelta('0 days 00:38:14')}

我想总结所有值并显示总时间戳(添加所有时间戳)作为输出。知道如何实现这个要求吗?

我尝试将其转换为列表,然后使用 sum() 函数,但它们不适用于时间戳。

将字典转换为 Series,因此可以使用 sum 的时间增量,默认情况下排除 NoneNaN

d = {1: pd.Timedelta('0 days 01:44:39'),
 2: pd.Timedelta('0 days 02:34:01'),
 3: pd.Timedelta('0 days 00:49:15'),
 4: pd.Timedelta('0 days 01:13:26'),
 5: pd.Timedelta('0 days 00:38:14')}

s = pd.Series(d)
print (s.sum())
0 days 06:59:35

您可以使用 functools.reduce:

>>> from functools import reduce
>>> d = {1: pd.Timedelta('0 days 01:44:39'),
 2: pd.Timedelta('0 days 02:34:01'),
 3: pd.Timedelta('0 days 00:49:15'),
 4: pd.Timedelta('0 days 01:13:26'),
 5: pd.Timedelta('0 days 00:38:14')}
>>> reduce(lambda a,b: a+b, d.values())
#Timedelta('0 days 06:59:35')

sum(iterable, start)
iterable : iterable can be anything list , tuples or dictionaries , but most importantly it should be numbers.

start : this start is added to the sum of numbers in the iterable.

从上面可以看出 sum 函数仅适用于 numbers

要使其与 timedeltas 一起使用,请使用 Python 的 datetime 模块。执行以下操作:

In [804]: d = {1: Timedelta('0 days 01:44:39'),
     ...:  2: Timedelta('0 days 02:34:01'),
     ...:  3: Timedelta('0 days 00:49:15'),
     ...:  4: Timedelta('0 days 01:13:26'),
     ...:  5: Timedelta('0 days 00:38:14')}

In [805]: import datetime

In [803]: sum(d.values(), datetime.timedelta())
Out[803]: Timedelta('0 days 06:59:35')

小数据集所有答案的时间表现:

@jezrael 的回答:

In [806]: def j():
     ...:     s = pd.Series(d)
     ...:     return s.sum()
     ...: 

In [807]: %timeit j()
491 µs ± 86.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

@Pablo 的回答:

In [810]: %timeit reduce(lambda a,b: a+b, d.values())
22.7 µs ± 250 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

@我的回答:

In [808]: %timeit sum(d.values(), datetime.timedelta())
31.9 µs ± 451 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)