将时间从(mm:ss.ddd)转换为(ss.ddd)

0 投票
2 回答
536 浏览
提问于 2025-04-18 01:54

我现在有一个字符串列表,格式是 (mm:ss.ddd):

[['0:00.762', '0:01.435'], ['2:01.374', '2:07.423'], ['3:01.412', '3:07.314']]

我想把它们转换成 (ss.ddd) 这种格式:

[['0.762', '1.435'], ['121.374', '127.423'], ['181.412', '187.314']]

简单来说,就是把冒号 ':' 左边的字符拿出来,转成整数,然后乘以 60,再加上冒号 ':' 右边但在 '.' 前面的数字。

我对 Python 的字符串处理工具不太熟悉,所以想问问有没有人能想到一个聪明又高效的方法,利用内置的方法来实现这个转换。

谢谢大家的帮助!

2 个回答

0
from decimal import Decimal

times = [['0:00.762', '0:01.435'], ['2:01.374', '2:07.423'], ['3:01.412', '3:07.314']]

converted_times = [ [str(int(time.split(":")[0])*60 + Decimal(time.split(":")[1])) for time in time_list] for time_list in times]
# thanks @shaktimaan

但是你为什么要用字符串的方法来做这个呢?这里有个更好的方法:

import datetime

times = [['0:00.762', '0:01.435'], ['2:01.374', '2:07.423'], ['3:01.412', '3:07.314']]

def convert_time(times):
    for timepair in times:
        accumulator = list()
        for time in timepair:
            t = datetime.datetime.strptime(time,"%M:%S.%f")
            accumulator.append("{}.{}".format(t.minute*60+t.second,t.microsecond//1000))
        yield accumulator

for timepair in convert_time(times):
    print(timepair) # or whatever.
1

让我们把这个问题拆分成几个部分。首先,我们需要一个函数,能够把每个元素从 mm:ss.dd 格式转换成 ss.dd 格式。这其实很简单:

def convert(s):
    mins, secs = s.split(':')
    mins = int(mins)
    secs = float(secs)
    secs = 60 * mins + secs
    return secs

看起来我们可以直接用 map 来转换列表中的元素:

converted_times = map(convert, orig_times)

不过,convert 这个函数只处理一个单独的元素(比如 '0:00.762'),而我们的数据实际上是一个列表的列表——具体来说,是一对一对的列表。我们还需要另一个函数,能够接受一对元素(作为一个列表)并返回它们。我们还希望返回的结果是字符串格式,而不是浮点数:

def convert_pair(p):
    p0, p1 = convert(p[0]), convert(p[1])
    return [str(p0), str(p1)]

把这些结合起来,我们可以简单地这样做

converted_times = map(convert_pair, orig_times)

来转换数据对的列表。

这段代码的示例可以在 这里 找到。

撰写回答