从两个独立列表中减去datetime.time对象
我有两个列表,每个列表里都有相同数量的对象,而且这些对象都是 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)]