【问题标题】:How do I remove the microseconds from a timedelta object?如何从 timedelta 对象中删除微秒?
【发布时间】:2013-08-30 12:10:06
【问题描述】:

我计算了平均时间,我想显示结果平均值,不包括微秒。

avg = sum(datetimes, datetime.timedelta(0)) / len(datetimes)

【问题讨论】:

  • 什么是'datetimes'...时间增量列表?如果是这样,总和会返回一个包含微秒的 timedelta 对象......那有什么问题?
  • avg.strftime("%Y-%m-%d %H:%M:%S"),但它会返回字符串。

标签: python datetime format timedelta


【解决方案1】:

我认为这是在没有微秒的情况下获得最后几分钟的最佳方式:

import time
import datetime
NOW = datetime.datetime.now()
LASTMINUTE =  NOW - datetime.timedelta(minutes=1, seconds = NOW.second, microseconds = NOW.microsecond)

【讨论】:

    【解决方案2】:
    c -= timedelta(microseconds=c.microseconds)
    

    【讨论】:

      【解决方案3】:

      鉴于timedelta 仅在内部存储天、秒和微秒,您可以构造一个没有微秒的新时间增量:

      from datetime import timedelta
      datetimes = (timedelta(hours=1, minutes=5, seconds=30, microseconds=9999), 
                   timedelta(minutes=35, seconds=17, microseconds=55), 
                   timedelta(hours=2, minutes=17, seconds=3, microseconds=1234))
      avg = sum(datetimes, timedelta(0)) / len(datetimes) # timedelta(0, 4756, 670429)
      avg = timedelta(days=avg.days, seconds=avg.seconds) # timedelta(0, 4756)
      

      【讨论】:

      • 我不知道为什么这被否决了,创建一个新的时间增量,明确地从旧的天数和秒数中减去比使用另一个新创建的 timedelta 减去微秒时多少有点骇人听闻。这是我至少会做的。
      【解决方案4】:

      另一个选项,给定 timedelta 你可以这样做:

      avg = datetime.timedelta(seconds=math.ceil(avg.total_seconds()))
      

      您可以根据情况将math.ceil() 替换为math.round()math.floor()

      【讨论】:

        【解决方案5】:

        取timedelta并去掉它自己的微秒,作为微秒和只读属性:

        avg = sum(datetimes, datetime.timedelta(0)) / len(datetimes)
        avg = avg - datetime.timedelta(microseconds=avg.microseconds)
        

        如果需要,您可以制作自己的小功能:

        import datetime
        
        def chop_microseconds(delta):
            return delta - datetime.timedelta(microseconds=delta.microseconds)
        

        我还没有找到更好的解决方案。

        【讨论】:

        • 据我所知应该是microsecond
        • 应该是microseconds。证明here
        • 在 timedelta 对象上是 microseconds,但在时间和日期时间对象上是 microsecond
        【解决方案6】:

        我发现这对我有用:

        start_time = datetime.now()
        some_work()
        end time = datetime.now()
        print str(end_time - start_time)[:-3]
        

        输出:

        0:00:01.955
        

        我在https://docs.python.org/3.2/library/datetime.html#timedelta-objects搜索后想到了这个

        希望这会有所帮助!

        【讨论】:

        • 正如 stackoverflow 上无数其他线程中提到的那样,这不是一个好主意,因为 (1) 并非所有 timedelta 对象都以 6 个字符显示(参见 0 时间增量)用于微秒部分,并且(2) 这不涉及任何形式的舍入。
        【解决方案7】:

        如果只是为了展示,这个想法是可行的:

        avgString = str(avg).split(".")[0]
        

        我们的想法是只取重点之前的内容。 它将为 01:23:45.1235

        返回 01:23:45

        【讨论】:

        • 简单漂亮。
        • 这一款简单又好用。应该被认为是最好的答案恕我直言
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-15
        • 2016-03-16
        • 2019-04-07
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        相关资源
        最近更新 更多