【问题标题】:Converting a float to hh:mm format将浮点数转换为 hh:mm 格式
【发布时间】:2023-03-21 18:47:02
【问题描述】:

我想打印一个浮点值,它是在执行一些数学运算后得到的,作为 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]

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

【问题讨论】:

  • 定义“不能正常工作”。定义“错误的时间”。

标签: python date python-3.x time


【解决方案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")
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-20
          • 2019-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-22
          • 2021-08-09
          • 2013-11-11
          相关资源
          最近更新 更多