从两个独立列表中减去datetime.time对象

2 投票
2 回答
1527 浏览
提问于 2025-04-18 17:32

我有两个列表,每个列表里都有相同数量的对象,而且这些对象都是 datetime.time 类型的时间。例如:

list1 = [ Dt_Obj_1, Dt_Obj_2]
list2 = [ Dt_Obj_3, Dt_Obj_4]

我总是需要以这种格式进行减法:

list2[0] - list1[0] , list2[1] - list1[1], etc..

我需要返回 timedelta 对象,所以我也试着把这个放进去:

datetime.combine(datetime(1,1,1,0,0,0), dt_obj2) - datetime.combine(datetime(1,1,1,0,0,0), dt_obj1)

我用列表推导式来尝试,但我似乎找不到一种方法把这些东西组合在一起,让它能正常工作。这个列表最多可以存储7个 datetime.time() 对象,虽然我觉得这可能很简单,但我还是想提一下,以防万一。

2 个回答

0

你可以试试这个:

import datetime

def seconds_since_midnight(time):
    return 3600*time.hour + 60*time.minute + time.second

def subtract_times(t1, t2):
    s1, s2 = map(seconds_since_midnight, [t1, t2])
    return datetime.timedelta(seconds = s1 - s2)

result = [subtract_times(t1, t2) for t1, t2 in zip(list2, list1)]

当然,你可以把所有的代码写在一个函数里,但我选择了这样做。

4

使用 zip() 可以把多个列表合并在一起,然后用 datetime.datetime.combine()datetime.date.min 来处理日期和时间。

import datetime
from functools import partial

comb = partial(datetime.datetime.combine, datetime.date.min)

result = [comb(t1) - comb(t2) for t1, t2 in zip(list1, list2)]

我在这里用 functools.partial() 让列表推导式看起来简单一些;调用 comb(argument) 实际上和调用 datetime.datetime.combine(datetime.date.min, argument) 是一样的。

示例:

>>> import datetime
>>> from functools import partial
>>> list1 = [datetime.time(10, 20), datetime.time(13, 14)]
>>> list2 = [datetime.time(2, 15), datetime.time(4, 21)]
>>> comb = partial(datetime.datetime.combine, datetime.date.min)
>>> [comb(t1) - comb(t2) for t1, t2 in zip(list1, list2)]
[datetime.timedelta(0, 29100), datetime.timedelta(0, 31980)]

撰写回答