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 |
|
---|