How to round the minute of a datetime object How to round the minute of a datetime object python python

How to round the minute of a datetime object


This will get the 'floor' of a datetime object stored in tm rounded to the 10 minute mark before tm.

tm = tm - datetime.timedelta(minutes=tm.minute % 10,                             seconds=tm.second,                             microseconds=tm.microsecond)

If you want classic rounding to the nearest 10 minute mark, do this:

discard = datetime.timedelta(minutes=tm.minute % 10,                             seconds=tm.second,                             microseconds=tm.microsecond)tm -= discardif discard >= datetime.timedelta(minutes=5):    tm += datetime.timedelta(minutes=10)

or this:

tm += datetime.timedelta(minutes=5)tm -= datetime.timedelta(minutes=tm.minute % 10,                         seconds=tm.second,                         microseconds=tm.microsecond)


General function to round a datetime at any time lapse in seconds:

def roundTime(dt=None, roundTo=60):   """Round a datetime object to any time lapse in seconds   dt : datetime.datetime object, default now.   roundTo : Closest number of seconds to round to, default 1 minute.   Author: Thierry Husson 2012 - Use it as you want but don't blame me.   """   if dt == None : dt = datetime.datetime.now()   seconds = (dt.replace(tzinfo=None) - dt.min).seconds   rounding = (seconds+roundTo/2) // roundTo * roundTo   return dt + datetime.timedelta(0,rounding-seconds,-dt.microsecond)

Samples with 1 hour rounding & 30 minutes rounding:

print roundTime(datetime.datetime(2012,12,31,23,44,59,1234),roundTo=60*60)2013-01-01 00:00:00print roundTime(datetime.datetime(2012,12,31,23,44,59,1234),roundTo=30*60)2012-12-31 23:30:00


I used Stijn Nevens code (thank you Stijn) and have a little add-on to share. Rounding up, down and rounding to nearest.

update 2019-03-09 = comment Spinxz incorporated; thank you.

update 2019-12-27 = comment Bart incorporated; thank you.

Tested for date_delta of "X hours" or "X minutes" or "X seconds".

import datetimedef round_time(dt=None, date_delta=datetime.timedelta(minutes=1), to='average'):    """    Round a datetime object to a multiple of a timedelta    dt : datetime.datetime object, default now.    dateDelta : timedelta object, we round to a multiple of this, default 1 minute.    from:  http://stackoverflow.com/questions/3463930/how-to-round-the-minute-of-a-datetime-object-python    """    round_to = date_delta.total_seconds()    if dt is None:        dt = datetime.now()    seconds = (dt - dt.min).seconds    if seconds % round_to == 0 and dt.microsecond == 0:        rounding = (seconds + round_to / 2) // round_to * round_to    else:        if to == 'up':            # // is a floor division, not a comment on following line (like in javascript):            rounding = (seconds + dt.microsecond/1000000 + round_to) // round_to * round_to        elif to == 'down':            rounding = seconds // round_to * round_to        else:            rounding = (seconds + round_to / 2) // round_to * round_to    return dt + datetime.timedelta(0, rounding - seconds, - dt.microsecond)# test dataprint(round_time(datetime.datetime(2019,11,1,14,39,00), date_delta=datetime.timedelta(seconds=30), to='up'))print(round_time(datetime.datetime(2019,11,2,14,39,00,1), date_delta=datetime.timedelta(seconds=30), to='up'))print(round_time(datetime.datetime(2019,11,3,14,39,00,776980), date_delta=datetime.timedelta(seconds=30), to='up'))print(round_time(datetime.datetime(2019,11,4,14,39,29,776980), date_delta=datetime.timedelta(seconds=30), to='up'))print(round_time(datetime.datetime(2018,11,5,14,39,00,776980), date_delta=datetime.timedelta(seconds=30), to='down'))print(round_time(datetime.datetime(2018,11,6,14,38,59,776980), date_delta=datetime.timedelta(seconds=30), to='down'))print(round_time(datetime.datetime(2017,11,7,14,39,15), date_delta=datetime.timedelta(seconds=30), to='average'))print(round_time(datetime.datetime(2017,11,8,14,39,14,999999), date_delta=datetime.timedelta(seconds=30), to='average'))print(round_time(datetime.datetime(2019,11,9,14,39,14,999999), date_delta=datetime.timedelta(seconds=30), to='up'))print(round_time(datetime.datetime(2012,12,10,23,44,59,7769),to='average'))print(round_time(datetime.datetime(2012,12,11,23,44,59,7769),to='up'))print(round_time(datetime.datetime(2010,12,12,23,44,59,7769),to='down',date_delta=datetime.timedelta(seconds=1)))print(round_time(datetime.datetime(2011,12,13,23,44,59,7769),to='up',date_delta=datetime.timedelta(seconds=1)))print(round_time(datetime.datetime(2012,12,14,23,44,59),date_delta=datetime.timedelta(hours=1),to='down'))print(round_time(datetime.datetime(2012,12,15,23,44,59),date_delta=datetime.timedelta(hours=1),to='up'))print(round_time(datetime.datetime(2012,12,16,23,44,59),date_delta=datetime.timedelta(hours=1)))print(round_time(datetime.datetime(2012,12,17,23,00,00),date_delta=datetime.timedelta(hours=1),to='down'))print(round_time(datetime.datetime(2012,12,18,23,00,00),date_delta=datetime.timedelta(hours=1),to='up'))print(round_time(datetime.datetime(2012,12,19,23,00,00),date_delta=datetime.timedelta(hours=1)))