乘以Python的时间对象?

时间:2019-02-21 16:10:09

标签: python time

我想估计执行用python编写的具有(嵌套)循环的脚本所需的剩余时间,并且在循环内部有一个测试,该测试可能需要几秒钟的时间才能执行。该测试将执行数千次,因此需要数小时才能完成。通过测量一项测试需要多长时间,我想估计脚本完成之前需要花费几个小时。

from time import time, strftime

for i in range(n):
    t = time()      # current time
    ...very complicated test that can take quite a few seconds that uses i 
    elapsed = time() - t    #calculate time required to execute test

当我尝试乘以执行一次测试所需的时间

remaining_time = elapsed * (n - i)
remaining_time_s = strftime("%H:%M:%S", remaining_time)
print("estimated remaining time:", remaining_time)

strftime的呼叫给出:

TypeError: Tuple or struct_time argument require

为什么time()的倍数不是时间对象?

4 个答案:

答案 0 :(得分:1)

如果您是从time模块中获得的,那么t将是浮点数:

>>> import time
>>> t = time.time()
>>> type(t)
<type 'float'>
>>> time.time()
1550765873.363

这意味着elapsed也可能是浮点数,remainingTime也是如此。但是strftime需要输入datetime.date对象。

>>> t = datetime.datetime.now()
>>> type(t)
<type 'datetime.datetime'>
>>> print(datetime.datetime.strftime(t, "%H:%M:%S"))
11:16:57

另外,请注意参数的顺序。

如果您希望将经过的时间(秒)转换为H:M:S,则可以执行以下操作:

H = remaining // 3600
M = (remaining - (3600*H)) // 60
S = remaining - (3600*H) - (60*M)
print("%d:%d:%d" % (H, M, S))

答案 1 :(得分:1)

假设您引用的是time.time()而不是datetime.time()(因为在后一种情况下您不能相乘),time.time()不是时间对象。这是floatdatetime.strftime正在寻找datetime对象。

如果您查看自己的remainingTime,您会发现它实际上应该是一个float,它比您期望的要小得多。这是因为通过执行time() - t,您实际上剥离了大部分时间戳信息,使您可以转换回datetime

简而言之,请勿使用strftime来转换float。您可以改为:

for i in range(n):
    t = datetime.datetime.now()

    ... some codes ...

    elapsed = datetime.datetime.now() - t   # gives you a timedelta object

    elapsed *= n-1                          # still a timedelta object

    print(elapsed)

    # 0:00:42.276000

答案 2 :(得分:0)

您的elapsed和您的remaining_time值只是浮点数,而不是struct_time。您可以使用gmtimelocaltime进行转换:

>>> from time import time, localtime, strftime
>>> t = time()
>>> elapsed = time() - t
>>> strftime("%H:%M:%S", localtime(t))
'08:22:03'
>>> strftime("%H:%M:%S", localtime(elapsed + t))
'08:22:25'

您可能希望切换到datetime个对象,可以将它们相减(产生timedelta个对象),并且可以轻松地操纵所有这些对象:

>>> n = datetime.now()
>>> m = datetime.now()
>>> m - n
datetime.timedelta(0, 4, 316830)
>>> delta = m - n
>>> delta * 5
datetime.timedelta(0, 21, 584150)
>>> m + delta
datetime.datetime(2019, 2, 21, 8, 28, 24, 943365)

答案 3 :(得分:0)

您的elapsed值是一个浮点数。您可以将其转换为datetime.timedelta对象并打印出来。这样做不能允许您指定字符串格式。

from datetime import timedelta

remainingTime = timedelta(seconds=(elapsed*(n-i)))
print("estimated remaining time: {}".format(str(remainingTime))