【问题标题】:Python: change "- hrs - min - sec' string into minutes decimalPython:将“-hrs-min-sec”字符串更改为分钟小数
【发布时间】:2016-09-25 06:24:14
【问题描述】:

我目前正在使用 Python 进行一个项目(必须自学 Python,目前仍在学习),该项目从给我的 csv 文件中获取数据。

我目前正纠结于如何循环遍历列表以将列表中的字符串(例如“2 小时 5 分 15 秒”)转换为小数并将其保存为另一个列表/数组。

我知道 H:M:S,但在列表的某些区域,它只是“8 分 4 秒”,所以它从小时计数到只有分钟和秒不等。

【问题讨论】:

  • 十进制 2:05:15 是什么意思,这是您想要的“2 小时 5 分 15 秒”和 0:08:04 的“8 分 4 秒”吗?
  • 不,我的意思是十进制,因为将“2 小时 5 分 15 秒”更改为以十进制形式计算的总分钟数。例如,“8 分 4 秒”将是 8.0666。
  • 你说你想要的是分钟,而不是秒......

标签: python list csv time


【解决方案1】:

功能:

def hms_to_mins(t):
    h, m, s = [int(i) for i in t.split(' ')]
    return float(60*h + m + (s/60))

hms_to_mins('5 30 0')

输出:330.0

您可以添加更多内容来验证输入并检查是否有 3 个输入(小时、分钟和秒)。

如果你想输入“5hrs 30mins 2sec”并运行,在上面的代码中使用这个(而不是hms_to_mins('5 30 0')):

import re
t=' '.join(re.findall('\d+', s))
hms_to_mins(t)

所以代码是:

import re

def hms_to_mins(t):
    h, m, s = [int(i) for i in t.split(' ')]
    return float(60*h + m + (s/60))

s='5hrs3mins0sec'  //your time string
t=(re.findall('\d+', s))
while(len(t)<3): t.append(str(0))
t=' '.join(t)

hms_to_mins(t)

输出:303.0

【讨论】:

  • 只需在退货中添加float()
  • @Merlin 我想你的问题现在已经回答了。
  • @AniMenon,用大锤敲碎坚果。 +1
  • @Merlin 我已经特别提到了您可以添加更多内容来验证输入并检查是否有 3 个输入(小时、分钟和秒)。
  • @AniMenon,OP 给了你 2 个例子——你的答案至少应该适用于这些例子。
【解决方案2】:

解析这些时间字符串有多种选择。这是一种方法(可能不是最短的方法,但很容易理解) - 使用time.strptime() 使用 3 种不同格式通过反复试验来加载时间字符串:

import time
from datetime import timedelta


def get_seconds(item):
    try:
        x = time.strptime(item, '%H hrs %M min %S sec')
    except ValueError:
        try:
            x = time.strptime(item, '%M min %S sec')
        except ValueError:
            x = time.strptime(item, '%S sec')
    return timedelta(hours=x.tm_hour, minutes=x.tm_min, seconds=x.tm_sec).total_seconds()

l = [
    "2 hrs 5 min 15 sec",
    "8 min 4 sec",
    "2 sec"
]

for item in l:
    print(get_seconds(item))

打印每个时间字符串的总秒数:

7515.0
484.0
2.0

【讨论】:

    【解决方案3】:
    def str2dig(s):
          nline = s.split(' ')
          if len(nline) == 6:
              minutes = int(nline[0])*60+int(nline[2])+ float(nline[4])/60
          elif len(nline) == 4:
              minutes = int(nline[0]) + float(nline[2])/60
          else:
              minutes = float(nline[0])/60
          return round(minutes,2)
    
    
    s = '2 hrs 5 min 15 sec'
    print str2dig(s)
    s = '8 min 4 sec'
    print str2dig(s)
    
    ll      = ['2 hrs 5 min 15 sec', '8 min 4 sec']
    newtime = [ str2dig(s) for s in ll ]  
    print newtime
    #[125.25, 8.07]
    

    【讨论】:

    • 谁投反对票?没有导入和pythonic??
    • 也不确定,这个话题出现了奇怪的反对票。
    猜你喜欢
    • 2015-07-28
    • 2020-01-28
    • 1970-01-01
    • 2020-01-13
    • 2021-06-26
    • 1970-01-01
    • 2020-10-18
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多