首页 > 解决方案 > 从日期列表计算时间

问题描述

我正在寻找一种最简单的解决方案来计算时间。我有一个示例列表列表。我需要计算每一天的结束时间 - 开始时间。例如 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)

标签: pythonpython-3.x

解决方案


这是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()}

推荐阅读