You can use groupby numpy array - datetimes with minutes and seconds removed:
print (df['date'].values.astype('<M8[h]')) ['2016-12-06T10' '2016-12-06T10' '2016-12-06T09' '2016-12-06T09' '2016-12-06T09' '2016-12-06T11' '2016-12-06T10' '2016-11-06T09' '2016-11-06T09' '2016-11-06T09'] print (df.groupby(df['date'].values.astype('<M8[h]')).Item.unique()) 2016-11-06 09:00:00 [Item1, Item3, Item4] 2016-12-06 09:00:00 [Item1, Item3, Item4] 2016-12-06 10:00:00 [Item1, Item2] 2016-12-06 11:00:00 [Item1] Name: Item, dtype: object print (df.groupby(df['date'].values.astype('<M8[h]')).Item .apply(lambda x: x.unique().tolist()).to_dict()) {Timestamp('2016-11-06 09:00:00'): ['Item1', 'Item3', 'Item4'], Timestamp('2016-12-06 09:00:00'): ['Item1', 'Item3', 'Item4'], Timestamp('2016-12-06 10:00:00'): ['Item1', 'Item2'], Timestamp('2016-12-06 11:00:00'): ['Item1']}
print (df.groupby(df['date'].values.astype('<M8[D]')).Item .apply(lambda x: x.unique().tolist()).to_dict()) {Timestamp('2016-11-06 00:00:00'): ['Item1', 'Item3', 'Item4'], Timestamp('2016-12-06 00:00:00'): ['Item1', 'Item2', 'Item3', 'Item4']}
Thanks to Jeff for using round :
print (df.groupby(df['date'].dt.round('h')).Item .apply(lambda x: x.unique().tolist()).to_dict()) {Timestamp('2016-11-06 10:00:00'): ['Item1', 'Item3', 'Item4'], Timestamp('2016-12-06 12:00:00'): ['Item1'], Timestamp('2016-12-06 10:00:00'): ['Item1', 'Item3', 'Item4'], Timestamp('2016-12-06 11:00:00'): ['Item1', 'Item2']} print (df.groupby(df['date'].dt.round('d')).Item .apply(lambda x: x.unique().tolist()).to_dict()) {Timestamp('2016-11-06 00:00:00'): ['Item1', 'Item3', 'Item4'], Timestamp('2016-12-06 00:00:00'): ['Item1', 'Item2', 'Item3', 'Item4']}