[976] | 1 | ###
|
---|
| 2 | ### Temporal Functions
|
---|
| 3 | ###
|
---|
| 4 |
|
---|
| 5 | import time
|
---|
| 6 | import datetime
|
---|
| 7 | import calendar
|
---|
| 8 | import pytz
|
---|
| 9 |
|
---|
| 10 | from ..math import micropad
|
---|
| 11 |
|
---|
| 12 | __all__ = [
|
---|
| 13 | 'timedelta_to_seconds',
|
---|
| 14 | 'mindatetime',
|
---|
| 15 | 'maxdatetime',
|
---|
| 16 | 'hh_mm_ss',
|
---|
| 17 | 'dd_hh_mm',
|
---|
| 18 | 'dd_hh_mm_ss',
|
---|
| 19 | 'timeslot',
|
---|
| 20 | 'backup_day',
|
---|
| 21 | 'iso',
|
---|
| 22 | ]
|
---|
| 23 |
|
---|
| 24 | ##
|
---|
| 25 | ## TimeError
|
---|
| 26 | ##
|
---|
| 27 | class TimeError(StandardError):
|
---|
| 28 | pass
|
---|
| 29 |
|
---|
| 30 |
|
---|
| 31 | ##
|
---|
| 32 | ## Return the duration of a timedelta object in seconds as a float.
|
---|
| 33 | ##
|
---|
| 34 | def timedelta_to_seconds(timedelta):
|
---|
| 35 | return float('%s.%s' % ((timedelta.days * 86400 ) + (timedelta.seconds), micropad(timedelta.microseconds)))
|
---|
| 36 |
|
---|
| 37 |
|
---|
| 38 | ##
|
---|
| 39 | ## Minimum date + 1 to allow for timezones
|
---|
| 40 | ##
|
---|
| 41 | def mindatetime(tz=pytz.timezone('UTC')):
|
---|
| 42 | return datetime.datetime(datetime.MINYEAR, 1, 2, tzinfo=tz)
|
---|
| 43 |
|
---|
| 44 |
|
---|
| 45 | ##
|
---|
| 46 | ## Maximum date + 1 to allow for timezones
|
---|
| 47 | ##
|
---|
| 48 | def maxdatetime(tz=pytz.timezone('UTC')):
|
---|
| 49 | return datetime.datetime(datetime.MAXYEAR, 12, 30, 23, 59, 59, 999999, tzinfo=tz)
|
---|
| 50 |
|
---|
| 51 |
|
---|
| 52 | ##
|
---|
| 53 | ## Convert seconds to HH:MM:SS
|
---|
| 54 | ##
|
---|
| 55 | def hh_mm_ss(seconds):
|
---|
| 56 | minutes, seconds = divmod(seconds, 60)
|
---|
| 57 | hours, minutes = divmod(minutes, 60)
|
---|
| 58 | return '%02d:%02d:%02d' % (hours, minutes, seconds)
|
---|
| 59 |
|
---|
| 60 |
|
---|
| 61 | ##
|
---|
| 62 | ## Convert seconds to DD:HH:MM
|
---|
| 63 | ##
|
---|
| 64 | def dd_hh_mm(seconds):
|
---|
| 65 | minutes, seconds = divmod(seconds, 60)
|
---|
| 66 | hours, minutes = divmod(minutes, 60)
|
---|
| 67 | days, hours = divmod(hours, 24)
|
---|
| 68 | return '%02d:%02d:%02d' % (days, hours, minutes)
|
---|
| 69 |
|
---|
| 70 |
|
---|
| 71 | ##
|
---|
| 72 | ## Convert seconds to DD HH:MM:SS
|
---|
| 73 | ##
|
---|
| 74 | def dd_hh_mm_ss(seconds):
|
---|
| 75 | minutes, seconds = divmod(seconds, 60)
|
---|
| 76 | hours, minutes = divmod(minutes, 60)
|
---|
| 77 | days, hours = divmod(hours, 24)
|
---|
| 78 | return '%02d %02d:%02d:%02d' % (days, hours, minutes, seconds)
|
---|
| 79 |
|
---|
| 80 |
|
---|
| 81 | ##
|
---|
| 82 | ## Round timestamp to timeslot according to step value
|
---|
| 83 | ##
|
---|
| 84 | def timeslot(t, step=60):
|
---|
| 85 |
|
---|
| 86 | if 86400 % step != 0:
|
---|
| 87 | raise TimeError, 'step %d is not evenly divisible into 86400 seconds (1 day)!' % (step)
|
---|
| 88 | elif type(t) is datetime.datetime:
|
---|
| 89 | seconds = (t.minute * 60) + t.second
|
---|
| 90 | seconds = seconds - seconds % step
|
---|
| 91 | minute, second = divmod(seconds, 60)
|
---|
| 92 | return t.replace(minute=minute, second=second, microsecond=0)
|
---|
| 93 | elif type(t) is int or type(t) is long:
|
---|
| 94 | return t - t % step
|
---|
| 95 | elif type(t) is float:
|
---|
| 96 | t = long(t)
|
---|
| 97 | return t - t % step
|
---|
| 98 | else:
|
---|
| 99 | return None
|
---|
| 100 |
|
---|
| 101 |
|
---|
| 102 | ##
|
---|
| 103 | ## Return backup day from datetime
|
---|
| 104 | ##
|
---|
| 105 | def backup_day(t, offset=8):
|
---|
| 106 |
|
---|
| 107 | if t.hour < offset:
|
---|
| 108 | t = t - datetime.timedelta(days=1)
|
---|
| 109 |
|
---|
| 110 | return t.replace(hour=0, minute=0, second=0, microsecond=0)
|
---|
| 111 |
|
---|
| 112 |
|
---|
| 113 | ##
|
---|
| 114 | ## Return timestamp as ISO formatted string
|
---|
| 115 | ##
|
---|
| 116 | def iso(t,nosep=False):
|
---|
| 117 |
|
---|
| 118 | if nosep is True:
|
---|
| 119 | return t.strftime('%Y%m%d%H%M%S')
|
---|
| 120 | else:
|
---|
| 121 | return t.strftime('%Y-%m-%d %H:%M:%S')
|
---|
| 122 |
|
---|
| 123 |
|
---|