【问题标题】:Is there a way to format a timedelta object to be hours-minutes-seconds.MILLISECONDS?有没有办法将 timedelta 对象格式化为 hours-minutes-seconds.MILLISECONDS?
【发布时间】:2021-03-31 20:40:17
【问题描述】:

我有这样的事情:

import datetime

a = datetime.datetime.now()
do_something_for_a_long_time()
b = datetime.datetime.now()
c = b - a

print("Doing <something> took {c}".format(c))

问题是这很好用,但我们希望秒值采用 . 的形式,而不是微秒?

我能够从那个 timedelta 对象中分离出毫秒属性,它似乎只有微秒可用。

【问题讨论】:

  • 那你为什么不从 micros 计算毫秒呢?
  • 通过将 micros 除以 1000 然后附加值?我不会随着时间的推移失去准确性吗?
  • 我认为您已经同意使用millis 而不是micros 来降低精度。更多详情请查看Python rounds numbers

标签: python timedelta


【解决方案1】:

如果您不想手动舍入,只需去掉微秒的最后三位:

def format_time():
t = datetime.datetime.now()
s = t.strftime('%Y-%m-%d %H:%M:%S.%f')
return s[:-3] `def format_time():
t = datetime.datetime.now()
s = t.strftime('%Y-%m-%d %H:%M:%S.%f')
return s[:-3]

【讨论】:

  • 我要转换的对象是一个timedelta,它没有strftime。另外,简单地砍数字真的可以吗?我不需要先除以什么吗?
  • 截断不是解决这个问题的好方法。正如AR所示,你可以拆分并调用round(),或查看this one等相关线程。
  • 很好,我可以执行t.microseconds 之类的操作,然后将该值转换为毫秒。现在,我如何将数字粘贴回对象中,以便打印语句给我类似:00:05:00.
  • @AR,请看下面我的回答。
【解决方案2】:

鉴于您的初始代码示例,您可以使用如下内容:

# From your example.
c = b - a

# Get the hours, minutes, and seconds.
minutes, seconds = divmod(c.seconds, 60)
hours, minutes = divmod(minutes, 60)

# Round the microseconds to millis.
millis = round(c.microseconds/1000, 0)

print(f"Doing <something> took {hours}:{minutes:02}:{seconds:02}.{millis}")

导致

# c = datetime.timedelta(seconds=7, microseconds=319673)
Doing <something> took 0:00:07.320

看看Python的内置函数round()divmod(),请戳thisthis相关线程;另外,请通读thisthis 线程以了解有关格式化timedelta 对象的更多信息。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多