Last active
May 14, 2017 18:54
-
-
Save lukassup/82b5b6f54f73945ccd3519127aac3a35 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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