Apoorv Ashutosh
Apoorv Ashutosh

Reputation: 4014

Grouping python list into timeslots of 3 hours

I have a list that is something like this:

[{datetime.date(2014, 2, 13): [datetime.time(13, 53, 53), datetime.time(13, 7, 52), datetime.time(12, 43, 35), datetime.time(12, 3, 14), datetime.time(11, 54, 53), datetime.time(10, 52, 42), datetime.time(10, 46, 3), datetime.time(10, 32, 50), datetime.time(10, 32, 38), datetime.time(10, 27, 38), datetime.time(10, 13, 50), datetime.time(10, 9, 59), datetime.time(10, 9, 48), datetime.time(10, 7, 42), datetime.time(10, 7, 20), datetime.time(10, 5, 5)]}

I want to slot the entire thing into slots of 3 hours, such that it can be displayed as:

datetime.date(2014, 2, 14):

time-slot : 
        datetime.time(0,0,0) - datetime.time(3,0,0)
           .
           . #all times in this slot
        datetime.time(3,0,0) - datetime.time(6,0,0)
           .
           . #all times in this slot

and so on.. I don't quite understand how to go about it. Can anyone help with some hints, or some algo, for me to understand how to do this?

Upvotes: 2

Views: 1140

Answers (2)

wolfrevo
wolfrevo

Reputation: 7303

you can also use groupby (from itertools import groupby) with list comprehension:

[(time_slot, [time_entry for time_slot, time_entry in time_entries]) for time_slot, time_entries  in groupby([(timelist_item.hour // 3, timelist_item) for timelist_item in timelist], lambda x: x[0])]

Produces following output:

[(4,
  [datetime.time(13, 53, 53),
   datetime.time(13, 7, 52),
   datetime.time(12, 43, 35),
   datetime.time(12, 3, 14)]),
 (3,
  [datetime.time(11, 54, 53),
   datetime.time(10, 52, 42),
   datetime.time(10, 46, 3),
   datetime.time(10, 32, 50),
   datetime.time(10, 32, 38),
   datetime.time(10, 27, 38),
   datetime.time(10, 13, 50),
   datetime.time(10, 9, 59),
   datetime.time(10, 9, 48),
   datetime.time(10, 7, 42),
   datetime.time(10, 7, 20),
   datetime.time(10, 5, 5)])]

using your data as follows:

timelist = [datetime.time(13, 53, 53), datetime.time(13, 7, 52), datetime.time(12, 43, 35), datetime.time(12, 3, 14), datetime.time(11, 54, 53), datetime.time(10, 52, 42), datetime.time(10, 46, 3), datetime.time(10, 32, 50), datetime.time(10, 32, 38), datetime.time(10, 27, 38), datetime.time(10, 13, 50), datetime.time(10, 9, 59), datetime.time(10, 9, 48), datetime.time(10, 7, 42), datetime.time(10, 7, 20), datetime.time(10, 5, 5)]

timelist is the value of your dictionary's day key. As pointed out by @thefourtheye This list has to be sorted to work with groupby:

dictionary_list = [{datetime.date(2014, 2, 13): [datetime.time(13, 53, 53), ...
timelist = dictionary_list[0].items()[0][1]
timelist.sort()

Upvotes: 2

thefourtheye
thefourtheye

Reputation: 239483

from pprint import pprint
result = {}
for current_dict in d:
    for key in current_dict:
        slots = {}
        for item in current_dict[key]:
            slots.setdefault(item.hour/3+1, [])
            slots[item.hour/3+1].append(item)
        result[key] = slots
pprint(result)

Output

{datetime.date(2014, 2, 13): {4: [datetime.time(11, 54, 53),
                                  datetime.time(10, 52, 42),
                                  datetime.time(10, 46, 3),
                                  datetime.time(10, 32, 50),
                                  datetime.time(10, 32, 38),
                                  datetime.time(10, 27, 38),
                                  datetime.time(10, 13, 50),
                                  datetime.time(10, 9, 59),
                                  datetime.time(10, 9, 48),
                                  datetime.time(10, 7, 42),
                                  datetime.time(10, 7, 20),
                                  datetime.time(10, 5, 5)],
                              5: [datetime.time(13, 53, 53),
                                  datetime.time(13, 7, 52),
                                  datetime.time(12, 43, 35),
                                  datetime.time(12, 3, 14)]}}

Upvotes: 2

Related Questions