将浮点数转换为 hh:mm 格式

Posted

技术标签:

【中文标题】将浮点数转换为 hh:mm 格式【英文标题】:Converting a float to hh:mm format 【发布时间】:2015-02-14 07:22:22 【问题描述】:

我想打印一个浮点值,它是在执行一些数学运算后得到的,作为 hh:mm 格式的时间字符串。目前我有像 9.888888888888886 这样的浮点数,我想要像 09:50 这样的时间。我试过以下代码:

    time = str(time)
    time = time.split(".")
    time[1] = float(time[1])
    time[1] *= 0.6
    time[1] = str(time[1])

当我打印时我使用

    str(time[0]) + ":" + time[1][:2]

有什么方法可以始终如一地达到这种效果?使用更高级的输入,我的上述代码无法正常工作,并输出错误的时间。

【问题讨论】:

定义“不能正常工作”。定义“错误的时间”。 【参考方案1】:

除了使用datetime,您还可以使用简单的格式和一些数学知识,例如:

result = '0:02.0f:1:02.0f'.format(*divmod(time * 60, 60))

(假设time 是非负数。)

【讨论】:

如果您希望它的格式为 HH:MM:SS 怎么办? 不正确舍入,time=0.999 变为 00:60 而不是 01:00【参考方案2】:

使用datetime.timedelta

>>> import datetime
>>> datetime.timedelta(hours=9.888888888888886)
datetime.timedelta(0, 35600)
>>> str(datetime.timedelta(hours=9.888888888888886))
'9:53:20'
>>> str(datetime.timedelta(hours=9.888888888888886)).rsplit(':', 1)[0]
'9:53'

>>> datetime.datetime.combine(datetime.date.today(), datetime.time()) + \
... datetime.timedelta(hours=9.888888888888886)
datetime.datetime(2014, 12, 16, 9, 53, 20)
>>> _.strftime('%H:%M')
'09:53'

【讨论】:

【参考方案3】:

使用 divmod 可以得到除法的余数和商。

minutes = 9.888888888888886*60
hours, minutes = divmod(minutes, 60)

print "%02d:%02d"%(hours,minutes)

输出:

09:53

如果你也想要秒数:

seconds = 9.888888888888886*60*60
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)

print "%02d:%02d:%02d"%(hours,minutes,seconds)

【讨论】:

【参考方案4】:

对于 python 3.7 版本,这变成了单行。

x = 9.888888888888886

print (str(datetime.timedelta(hours=x))[:-3])

(这里打印的是时间字符串减去最后三个字符。)

结果 1:9:53

如果您需要几秒钟的时间:

print (datetime.timedelta(hours=x))

结果 2:9:53:20

最后,如果您超过 24 小时标记,timedelta 也会显示添加的日期:

x = 39.888888888888886

结果 3:1 天,15:53:20

【讨论】:

【参考方案5】:

假设您想将 9.888888888888886 转换为 09:53,基于前者是浮点时间,并且您不想担心天数,如果没有库,您可以简单地这样做:

fhours = 9.888888888888886
ihours = int(ihours)
"%02d:%02d" % (ihours,(fhours-ihours)*60)

只有数学模块,试试

import math
"%02d:%02d" % (fhours,math.modf(fhours)[0]*60)

您可能认为使用datetime 模块会有所帮助,但实际上它有点繁琐。您可以通过传入小数小时数来获取 timedelta 对象:

 import datetime
 td = datetime.timedelta(hours=9.888888888888886)

但是将其放入时间对象或日期时间对象进行格式化是一件棘手的事情,你最终不得不做类似的事情

 import datetime
 td = datetime.timedelta(hours=9.888888888888886)
 (datetime.datetime(2000,1,1)+td).strftime("%H:%M")

(使用随机选择的日期将时间增量转换为要使用的日期时间)

【讨论】:

以上是关于将浮点数转换为 hh:mm 格式的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数转换为字符串而不会丢失精度

Javascript将浮点数转换为指数[重复]

将浮点数转换为美元和美分

将浮点数转换为整数

C将浮点数转换为int

使用 . 将浮点数转换为字符串。而不是 , [重复]