python - 从日期列表计算时间
问题描述
我正在寻找一种最简单的解决方案来计算时间。我有一个示例列表列表。我需要计算每一天的结束时间 - 开始时间。例如 2018-07-1 17:00 - 08:00 = 09:00。我尝试了很多循环并使用 itertools.combinations 进行迭代,但它总是失败。
[['2018-07-01', '8:00', 'IN'],
['2018-07-01', '12:00', 'OUT'],
['2018-07-01', '12:30', 'IN'],
['2018-07-01', '17:00', 'OUT'],
['2018-07-02', '8:00', 'IN'],
['2018-07-02', '12:00', 'OUT'],
['2018-07-02', '12:30', 'IN'],
['2018-07-02', '17:00', 'OUT'],
['2018-07-03', '8:00', 'IN'],
['2018-07-03', '12:00', 'OUT'],
['2018-07-03', '12:30', 'IN'],
['2018-07-03', '17:00', 'OUT'],
['2018-07-04', '8:00', 'IN'],
['2018-07-04', '17:00', 'OUT']]
我的尝试:
for idx, elemenet in enumerate(test):
try:
if elemenet[0] == test[idx + 1][0]:
print(elemenet)
except:
pass
index = 0
for a, b in itertools.combinations(test, 2):
if a[0] and b[0] and a[2] == 'IN' and b[2] == 'OUT':
print(a , b)
index += 1
print(index)
解决方案
这是itertools.groupby
用于 python3的解决方案
>>> lst = [['2018-07-01', '8:00', 'IN'], ['2018-07-01', '12:00', 'OUT'], ['2018-07-01', '12:30', 'IN'], ['2018-07-01', '17:00', 'OUT'], ['2018-07-02', '8:00', 'IN'], ['2018-07-02', '12:00', 'OUT'], ['2018-07-02', '12:30', 'IN'], ['2018-07-02', '17:00', 'OUT'], ['2018-07-03', '8:00', 'IN'], ['2018-07-03', '12:00', 'OUT'], ['2018-07-03', '12:30', 'IN'], ['2018-07-03', '17:00', 'OUT'], ['2018-07-04', '8:00', 'IN'], ['2018-07-04', '17:00', 'OUT']]
>>>
>>> from datetime import datetime
>>> from itertools import groupby
>>> to_time = lambda s: datetime.strptime(s, '%H:%M')
>>> diff_time = lambda s1, s2: str(to_time(s1)-to_time(s2))
>>>
>>> res = {date:diff_time(last[1], first[1]) for date,(first,*_,last) in groupby(lst, lambda x: x[0])}
>>> pprint(res)
{'2018-07-01': '9:00:00',
'2018-07-02': '9:00:00',
'2018-07-03': '9:00:00',
'2018-07-04': '9:00:00'}
对于python2,你需要res =
用这两行替换行
>>> res = {date:list(times) for date,times in groupby(lst, lambda x: x[0])}
>>> res = {date:diff_time(times[-1][1], times[0][1]) for date,times in res.items()}