【问题标题】:Convert time (HH:MM:SS) to minutes in python在python中将时间(HH:MM:SS)转换为分钟
【发布时间】:2018-07-04 22:52:15
【问题描述】:

如何将 HH:MM:SS 转换为分钟?

我试过下面的效果很好:

  import datetime as DT
  t1 = DT.datetime.strptime('0:10:00', '%H:%M:%S')

我尝试了另一个示例并收到错误:

  import datetime as DT
  t1 = DT.datetime.strptime('9715:56:46', '%H:%M:%S')

错误:

  ValueError: time data '9715:56:46' does not match format '%H:%M:%S'

在这个例子中,它支持 %H 的 Max 23,如果我的小时数超过 23(在这种情况下我有 9715 小时)如何获得它?

【问题讨论】:

  • 错误是不言自明的,您的小时组件是无效值,第一个示例应该是00,而9715 什么时候是有效小时?从最后一个示例中,您预计什么时间?
  • 小时(24 小时制)作为十进制数 [00,23]。这里:docs.python.org/2/library/time.html
  • 来自help(time.strptime):“%H 小时(24 小时制)为十进制数 [00,23]。”。

标签: python string python-2.7 datetime


【解决方案1】:
i = "15:21"
sp = i.split(":")
minutes = 0.0
if len(sp) == 3:
    minutes = minutes + int(sp[0]) * 60
    minutes = minutes + int(sp[1])
    minutes = minutes + int(sp[2]) / 60
elif len(sp) == 2:
    minutes = minutes + int(sp[0])
    minutes = minutes + int(sp[1]) / 60
elif len(sp) == 1:
    minutes = minutes + int(sp[0]) / 60
print(minutes)

一个很好的解决方案:)

【讨论】:

    【解决方案2】:

    假设您要将字符串“01:21:48”转换为分钟。

    from datetime import timedelta
    
    h = "01:21:48"
    delta = timedelta(hours=int(h.split(':')[0]), minutes=int(h.split(':')[1]), seconds=int(h.split(':')[2]))
    minutes = delta.total_seconds()/60
    print(minutes)
    

    所以打印出来的结果是:81.8

    【讨论】:

      【解决方案3】:

      一个简单的支持d:h:m:s / h:m:s / m:s / s的!

      def dhms_to_sec(dhms_str):
          '''supports also format of d:h:m:s, h:m:s, m:s and s'''
          _,d,h,m,s = (':0'*10+dhms_str).rsplit(':',4)
          return int(d)*24*60*60+int(h)*60*60+int(m)*60+int(s) 
      
      # examples:
      print(dhms_to_sec('04'))  # will print 4
      print(dhms_to_sec('1:04'))  # will print 64
      print(dhms_to_sec('1:01:04'))  # will print 3664
      print(dhms_to_sec('1:1:4'))  # will print 3664
      

      您可以通过 /60 将其转换为分钟 ... 它也会接受奇怪的情况,比如 1:56:0

      【讨论】:

        【解决方案4】:

        您可以将sum 与生成器表达式或map 一起使用:

        from operator import mul
        
        my_time = '9715:56:46'
        factors = (60, 1, 1/60)
        
        t1 = sum(i*j for i, j in zip(map(int, my_time.split(':')), factors))
        t2 = sum(map(mul, map(int, my_time.split(':')), factors))
        
        print(t1)  # 582956.7666666667
        
        assert t1 == t2
        

        【讨论】:

          【解决方案5】:

          正如错误所说,您提供了错误的小时值。

          它必须是 >=0 和

          [https://docs.python.org/2/library/datetime.html][1]

          转换成分钟:

          input_time='9715:56:46'
          t=input_time.split(':')
          
          total_minutes= int(t[0])*60+int(t[1])*1 +int(t[2])/60
          

          【讨论】:

            【解决方案6】:

            strptime 函数(在其各种化身中)并非旨在执行此类任务,它仅用于解析有效的时间/日期字符串。

            简单的解决方案是编写自己的代码来解析字符串并执行算术运算。这是一个输出秒数的示例;显然你可以除以 60 得到分钟。

            def hms_to_s(s):
                t = 0
                for u in s.split(':'):
                    t = 60 * t + int(u)
                return t
            
            data = (
                '10',
                '0:10',
                '1:30',
                '2:1:00',
                '1000:00:00',
                '9700:00:00',
                '15:56:46',
                '9715:56:46',
            )
            
            for s in data:
                print(s, hms_to_s(s)) 
            

            输出

            10 10
            0:10 10
            1:30 90
            2:1:00 7260
            1000:00:00 3600000
            9700:00:00 34920000
            15:56:46 57406
            9715:56:46 34977406
            

            【讨论】:

              【解决方案7】:

              datetime.datetime 是时间点的表示,而不是持续时间。

              datetime.timedelta 是时间长度的表示。观察:

              from datetime import timedelta
              
              
              delta = timedelta(hours=9715, minutes=56, seconds=46)
              total_seconds = delta.total_seconds()
              minutes = int(total_seconds // 60)
              seconds = int(total_seconds % 60)
              
              print('{minutes}:{seconds}'.format(minutes=minutes, seconds=seconds))
              

              编辑:我更改了代码以使用 python 2.7。

              【讨论】:

                【解决方案8】:

                您对库及其工作方式有一个不好的概念,看,第一个参数是格式为 00-23 的一天中的小时,例如 22 是晚上 10 点,因此有效时间范围从 00 到23、另一个输入是无效输入。

                示例:

                import datetime as DT
                t1 = DT.datetime.strptime('23:56:46', '%H:%M:%S')
                

                观察:

                第一个值可以是 000 ,但 000 也会产生同样的错误:

                t1 = DT.datetime.strptime('0:56:46', '%H:%M:%S') # it's ok
                t1 = DT.datetime.strptime('00:56:46', '%H:%M:%S') # it's ok
                t1 = DT.datetime.strptime('000:56:46', '%H:%M:%S') # same error you got
                

                【讨论】:

                • 对于像t1 = DT.datetime.strptime('0:56:46', '%H:%M:%S') 这样的格式,如果你有不是固定长度的值,你应该小心,因为在处理它时可能会出现模棱两可的行为。例如,如果您删除第一个冒号,则时间将更改为 5:06 am 而不是 12:06 am。在某些情况下,解析器无法工作,因为它不是 POSIXct 格式。一般来说,我使用正则表达式来修复不适用于datetime 模块的潜在歧义或格式。
                • @MaxCandocia 这是一个很好的观察我不知道,非常感谢分享!
                猜你喜欢
                • 2020-10-05
                • 1970-01-01
                • 2021-09-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-02-22
                相关资源
                最近更新 更多