Skip to content

Instantly share code, notes, and snippets.

@lukassup
Last active May 14, 2017 18:54
Show Gist options
  • Select an option

  • Save lukassup/82b5b6f54f73945ccd3519127aac3a35 to your computer and use it in GitHub Desktop.

Select an option

Save lukassup/82b5b6f54f73945ccd3519127aac3a35 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Datetime floor, ceiling and round utility functions."""
from datetime import datetime, timedelta
def datetime_floor(dt=None, delta=None, datetime=datetime, timedelta=timedelta):
"""Round datetime down to previous timedelta.
Default: round to previous midnight
:param dt datetime: datetime to floor (default: datetime.now())
:param delta timedelta: timedelta to floor against (default: timedelta(days=1))
:return datetime: datetime rounded down to previous timedelta
"""
dt = dt if dt else datetime.now()
delta = delta if delta else timedelta(days=1)
q, r = divmod(dt - datetime.min, delta)
return (datetime.min + q * delta) if r else dt
def datetime_ceil(dt=None, delta=None, datetime=datetime, timedelta=timedelta):
"""Round datetime up to next timedelta.
Default: round to next midnight
:param dt datetime: datetime to round up (default: datetime.now())
:param delta timedelta: timedelta to round up against (default: timedelta(days=1))
:return datetime: datetime rounded up to next timedelta
"""
dt = dt if dt else datetime.now()
delta = delta if delta else timedelta(days=1)
q, r = divmod(dt - datetime.min, delta)
return (datetime.min + (q + 1) * delta) if r else dt
def datetime_round(dt=None, delta=None, datetime=datetime, timedelta=timedelta):
"""Round datetime to nearest timedelta
default: round to nearest midnight
:param dt datetime: datetime to round (default: datetime.now())
:param delta timedelta: timedelta to round against (default: timedelta(days=1))
:return datetime: datetime rounded to the nearest timedelta
"""
dt = dt if dt else datetime.now()
delta = delta if delta else timedelta(days=1)
q, r = divmod(dt - datetime.min, delta)
if r >= (delta / 2):
q += 1
return (datetime.min + q * delta)
def main():
print(datetime_floor(delta=timedelta(minutes=5)))
print(datetime_ceil(delta=timedelta(minutes=5)))
print(datetime_round(delta=timedelta(minutes=5)))
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment