This module aims to help you create time periods from timestamps.
Pass in a datetime.datetime() object and a period name and it’ll return the beginning and end of that period.
>>> from datetime_periods import period
>>> period(datetime(2012, 4, 2, second=12), 'minute')
[datetime(2012, 4, 2), datetime(2012, 4, 2, 0, 0, 59)]
>>> period(datetime(2012, 4, 2), 'hour')
[datetime(2012, 4, 2, 0), datetime(2012, 4, 2, 0, 59, 59)]
>>> period(datetime(2012, 4, 2), 'day')
[datetime(2012, 4, 2), datetime(2012, 4, 2, 23, 59, 59)]
>>> period(datetime(2012, 4, 2), 'week')
[datetime(2012, 4, 2), datetime(2012, 4, 8, 23, 59, 59)]
>>> period(datetime(2012, 4, 15), 'month')
[datetime(2012, 4, 1), datetime(2012, 4, 30, 23, 59, 59)]
>>> period(datetime(2012, 4, 2), 'quarter')
[datetime(2012, 4, 1), datetime(2012, 6, 30, 23, 59, 59)]
>>> period(datetime(2012, 9, 1), 'half_year')
[datetime(2012, 7, 1), datetime(2012, 12, 31, 23, 59, 59)]
>>> period(datetime(2012, 7, 1), 'year')
[datetime(2012, 1, 1), datetime(2012, 12, 31, 23, 59, 59)]
The TimeRange class takes two times, start and stop, and creates datetime objects from them that is smart about when a date should roll over to the following day.
This class can also act like a 2 length list where index 0=start, 1=stop time. This to allow the class to be used for argument expansion and as an iterator.
>>> from datetime_periods import TimeRange
>>> tr = TimeRange('17:00', '23:00', '2013-12-25')
>>> tr.start
datetime(2013, 12, 25, 17)
>>> tr.stop
datetime(2013, 12, 25, 23)
>>> tr = TimeRange('17:00', '04:00', '2013-12-25')
>>> tr.start
datetime(2013, 12, 25, 17)
>>> tr.stop
datetime(2013, 12, 26, 4)
>>> tr[0] == tr.start
True
>>> tr[1] == tr.stop
True
The sugar module has sugar functions for all period variants available.
Sugar functions for entire period:
Sugar functions for beginning of period:
Sugar functions for end of period:
Takes two times, start and stop, and tries to be smart about putting a date to those times.
Stop is always assumed to follow start in chronological order, so if stop is numerically less than start then it must be tomorrow.
Strings are parsed with dateutil.parser from the python-dateutil package.
This class can also act like a 2 length list where index 0=start, 1=stop time. This to allow the class to be used for argument expansion and as an iterator.
Examples:
>>> tr = TimeRange('17:00', '23:00', '2013-12-25')
>>> tr.start
datetime(2013, 12, 25, 17)
>>> tr.stop
datetime(2013, 12, 25, 23)
>>> tr = TimeRange('17:00', '04:00', '2013-12-25')
>>> tr.start
datetime(2013, 12, 25, 17)
>>> tr.stop
datetime(2013, 12, 26, 4)
>>> tr[0] == tr.start
True
>>> tr[1] == tr.stop
True
Parameters: |
|
---|
Takes the given datetime and then creates the period_name that datetime belongs to. If given one in the middle of the day and period_name ‘day’ then it’ll be from 00:00:00 till 23:59:59.
Possible values for period_name:
Examples:
>>> period(datetime(2012, 4, 2), 'hour')
[datetime(2012, 4, 2, 0), datetime(2012, 4, 2, 0, 59, 59)]
>>> period(datetime(2012, 4, 2), 'day')
[datetime(2012, 4, 2), datetime(2012, 4, 2, 23, 59, 59)]
>>> period(datetime(2012, 4, 2), 'week')
[datetime(2012, 4, 2), datetime(2012, 4, 8, 23, 59, 59)]
>>> period(datetime(2012, 4, 2), 'quarter')
[datetime(2012, 4, 1), datetime(2012, 6, 30, 23, 59, 59)]
Params datetime: | |
---|---|
A truncated datetime object | |
Params period_name: | |
The period for which to calculate the end for datetime | |
Returns: | datetime with all fields to second set to the very last before before the next period |
Return type: | datetime datetime object |
Truncates a datetime to have the values with higher precision than the one set as truncate_to as zero (or one for day and month).
Possible values for truncate_to:
Examples:
>>> truncate(datetime(2012, 12, 12, 12), 'day')
datetime(2012, 12, 12)
>>> truncate(datetime(2012, 12, 14, 12, 15), 'quarter')
datetime(2012, 10, 1)
>>> truncate(datetime(2012, 3, 1), 'week')
datetime(2012, 2, 27)
Params datetime: | |
---|---|
an initialized datetime object | |
Params truncate_to: | |
The highest precision to keep its original data. | |
Returns: | datetime with truncated_to as the highest level of precision |
Return type: | datetime datetime object |
This function is an alias for datetime_truncate.truncate.
Returns a datetime where it is the end of period_name. Notice that period_end assumes that the datetime has been run by truncate before being passed in. If that is not the case the results might not be what is expected.
Possible values for period_name:
Examples:
>>> period_end(datetime(2012, 4, 2), 'hour')
datetime(2012, 4, 2, 0, 59, 59)
>>> period_end(datetime(2012, 4, 2), 'day')
datetime(2012, 4, 2, 23, 59, 59)
>>> period_end(datetime(2012, 4, 2), 'week')
datetime(2012, 4, 8, 23, 59, 59)
>>> period_end(datetime(2012, 4, 1), 'quarter')
datetime(2012, 6, 30, 23, 59, 59)
Params datetime: | |
---|---|
A truncated datetime object | |
Params period_name: | |
The period for which to calculate the end for datetime | |
Returns: | datetime with all fields to second set to the very last before before the next period |
Return type: | datetime datetime object |
Takes the given datetime and then creates the period_name that datetime belongs to. If given one in the middle of the day and period_name ‘day’ then it’ll be from 00:00:00 till 23:59:59.
Possible values for period_name:
Examples:
>>> period(datetime(2012, 4, 2), 'hour')
[datetime(2012, 4, 2, 0), datetime(2012, 4, 2, 0, 59, 59)]
>>> period(datetime(2012, 4, 2), 'day')
[datetime(2012, 4, 2), datetime(2012, 4, 2, 23, 59, 59)]
>>> period(datetime(2012, 4, 2), 'week')
[datetime(2012, 4, 2), datetime(2012, 4, 8, 23, 59, 59)]
>>> period(datetime(2012, 4, 2), 'quarter')
[datetime(2012, 4, 1), datetime(2012, 6, 30, 23, 59, 59)]
Params datetime: | |
---|---|
A truncated datetime object | |
Params period_name: | |
The period for which to calculate the end for datetime | |
Returns: | datetime with all fields to second set to the very last before before the next period |
Return type: | datetime datetime object |
Returns a datetime where it is the end of period_name. Notice that period_end assumes that the datetime has been run by truncate before being passed in. If that is not the case the results might not be what is expected.
Possible values for period_name:
Examples:
>>> period_end(datetime(2012, 4, 2), 'hour')
datetime(2012, 4, 2, 0, 59, 59)
>>> period_end(datetime(2012, 4, 2), 'day')
datetime(2012, 4, 2, 23, 59, 59)
>>> period_end(datetime(2012, 4, 2), 'week')
datetime(2012, 4, 8, 23, 59, 59)
>>> period_end(datetime(2012, 4, 1), 'quarter')
datetime(2012, 6, 30, 23, 59, 59)
Params datetime: | |
---|---|
A truncated datetime object | |
Params period_name: | |
The period for which to calculate the end for datetime | |
Returns: | datetime with all fields to second set to the very last before before the next period |
Return type: | datetime datetime object |
Sugar for datetime_truncate.truncate(datetime, 'day')
Sugar for datetime_truncate.truncate(datetime, 'half')
Sugar for datetime_truncate.truncate(datetime, 'hour')
Sugar for datetime_truncate.truncate(datetime, 'minute')
Sugar for datetime_truncate.truncate(datetime, 'month')
Sugar for datetime_truncate.truncate(datetime, 'quarter')
Sugar for datetime_truncate.truncate(datetime, 'second')
Sugar for datetime_truncate.truncate(datetime, 'week')
Sugar for datetime_truncate.truncate(datetime, 'year')
Sugar for period_end(datetime, 'half')
Sugar for period_end(datetime, 'minute')
Sugar for period_end(datetime, 'quarter')
Sugar for period_end(datetime, 'second')