Derive Cumulative Time and Reduce Key Value Pairs of Dictionary Within List in Python

Viewed 21

I have a list named list_a, as per below (record_details is document number, cabinet_number is where the document is placed, and created_at would be when the document is placed in epoch format):

list_a = [{
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663559616
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663559311
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663559006
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663558701
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663558396
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663558091
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663557786
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB4',
    'created_at': 1663557481
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'created_at': 1663557176
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'created_at': 1663556871
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'created_at': 1663556566
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'created_at': 1663556261
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB5',
    'created_at': 1663555956
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'created_at': 1663555651
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'created_at': 1663555346
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663555041
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663554736
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663554431
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663554126
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663553821
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663553516
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663553211
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663552906
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663552601
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663552296
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663551992
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663551688
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663551384
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663551080
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663550776
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663550471
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663550166
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663549861
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663549556
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663549255
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663548949
}]

The outcome I'm trying to achieve with this list would be like below (unique cabinet_number, and the total duration when the document is placed within that particular cabinet):

[{
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'duration': 1830
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB4',
    'duration': 305
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'duration': 915
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB5',
    'duration': 305
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'duration': 305
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'duration': 6092
}]

What I've tried so far:

list_b = []

for idx, ele in enumerate(list_a):
    if idx == 0:
        ele['time_difference'] = 0
    else:
        ele['time_difference'] = list_a[idx-1]['created_at'] - ele['created_at']

for idx, ele in enumerate(list_a):
    if idx == 0:
        ele['cabinet_number_cumulative'] = ele['cabinet_number']
    if idx > 0 and ele['cabinet_number'] != list_a[idx-1]['cabinet_number']:
        ele['cabinet_number_cumulative'] = ele['cabinet_number']
    if idx > 0 and ele['cabinet_number'] == list_a[idx-1]['cabinet_number']:
        ele['cabinet_number_cumulative'] = ''
        ele['duration'] = ele['time_difference'] + list_a[idx-1]['time_difference']
        
for idx, ele in enumerate(list_a):
    if ele['cabinet_number_cumulative'] != '':
        list_b.append(ele)
        
print(list_b)

I manage to get the unique cabinet_number combined together within list_b in order, however, I'm quite lost on the cumulative duration part.

[{
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663559616,
    'time_difference': 0,
    'cabinet_number_cumulative': 'LOADCAB1'
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB4',
    'created_at': 1663557481,
    'time_difference': 305,
    'cabinet_number_cumulative': 'LOADCAB4'
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'created_at': 1663557176,
    'time_difference': 305,
    'cabinet_number_cumulative': 'LOADCAB17'
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB5',
    'created_at': 1663555956,
    'time_difference': 305,
    'cabinet_number_cumulative': 'LOADCAB5'
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB17',
    'created_at': 1663555651,
    'time_difference': 305,
    'cabinet_number_cumulative': 'LOADCAB17'
}, {
    'record_details': '000000004C',
    'cabinet_number': 'LOADCAB1',
    'created_at': 1663555041,
    'time_difference': 305,
    'cabinet_number_cumulative': 'LOADCAB1'
}]

Any help or guidance is very much appreciated.

0 Answers
Related