【问题标题】:need the average from a list of timedelta objects需要来自 timedelta 对象列表的平均值
【发布时间】:2011-06-27 17:38:44
【问题描述】:

我创建了一个timedelta 对象列表,我需要获取该列表的平均值。当我尝试做的时候

return (sum(delta_list)/(len(delta_list)-1))

我明白了

TypeError: unsupported operand type(s) for +: 'int' and 'datetime.timedelta'

我是使用 python 的 datetime 类的新手。我也想知道如何将此平均值转换为天:小时:分钟:我不需要小于分钟的格式。

【问题讨论】:

  • Thanks in advanced.。不要提前感谢,以后忘记感谢。学会接受你的答案。
  • 您发布的代码有什么问题?它会出错吗?请显示您遇到的错误?
  • 我忘记粘贴了,我编辑了问题以包含错误。

标签: python datetime timedelta


【解决方案1】:

sum 需要一个起始值,默认为 0,但 0 无法添加到 timedelta,因此您会收到错误消息。

你只需要给sum一个timedelta()作为起始值:

# this is the average
return sum(delta_list, timedelta()) / len(delta_list)

要打印出来,你可以这样做:

print str(some_delta)

如果你想要定制的东西,你可以得到some_delta.dayssome_delta.seconds,但你必须计算两者之间的一切。

【讨论】:

  • @cferbs:是的,这是正确的,要得到你的平均水平sum( .. ) / len( .. )
  • 在 Python 3.3 中确保使用 '//' 运算符:
【解决方案2】:

首先,sum 将列表中的所有元素添加到初始值,默认情况下为0(值为 0 的整数)。因此,为了能够在 timedelta 的列表中使用 sum,您需要传递一个 timedelta(0) 参数 - sum(delta_list, timedelta(0))

其次,为什么要从列表的长度中减去一个?如果列表长度为 1,您将获得 ZeroDivisionError

修复上述问题后,您最终会得到一个 timedelta 对象作为平均值。如何将其转换为人类可读的格式,我留给你作为练习。 datetime module documentation 应该回答所有可能的问题。

【讨论】:

【解决方案3】:

sum() function 需要一个起始值来添加可迭代对象中的所有项目。它默认为0,这就是为什么您会收到关于将timedelta 添加到int 的错误。

要解决这个问题,只需将timedelta 对象作为第二个参数传递给sum

(创建不带参数的timedelta 会创建一个对应于零时差的timedelta。)

此外,一组项目的平均值通常是项目的总和除以项目的数量,因此您无需从 len(delta_list) 中减去 1。

这些更改意味着我们可以从您的声明中删除一些括号。

所以这给了你:

return sum(delta_list,timedelta()) / len(delta_list)

【讨论】:

    【解决方案4】:

    datetime.timedelta 对象具有访问天、微秒和秒的属性。您可以轻松引用这些内容,例如:

    >>> import datetime
    >>> daybefore = datetime.timedelta(days=1)
    >>> dayminus2 = datetime.timedelta(days=2, minutes=60)
    >>> daybefore.days
    1
    >>> dayminus2.days, dayminus2.seconds
    (2, 3600)
    

    要获得分钟,您必须将秒除以 60。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多