-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdttm.html
440 lines (435 loc) · 41.7 KB
/
dttm.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: module dttm</title>
</head><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong>dttm</strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/Users/mgoeller/Documents/vmware/projects/pig/tmp/dttm.py">/Users/mgoeller/Documents/vmware/projects/pig/tmp/dttm.py</a></font></td></tr></table>
<p><tt>DTTM is a UDF library that aims to make date manipulation simpler and more robust for unstructured data. <br>
Conceptually, the date/time UDFs in Hadoop are fine, but they seem to be designed to be easy to code, <br>
and not particularly easy to use for end users. <br>
<br>
The core design principles of the DTTM library are to: <br>
<br>
(1) Allow date and time manipulations from unstructured text, which I refer to as "temporal values". <br>
DTTM does not requiring specific formatting for dates or times, instead it tries to figure out what is in <br>
a text string and use it. Formatting temporals to fit the language is ass-backward, and typically <br>
this is a time consuming, difficult and error-prone part of data preparation.<br>
<br>
A temporal value could be anything from "09/25/2003 10:49:41 -03:00" to <br>
"Today is 25 of September of 2003, exactly at 10:49:41 with timezone -03:00." These should both be usable and<br>
interchangeable without user intervention.<br>
<br>
(2) Make temporal manipulations very easy to do, so that an analyst could understand them without needing <br>
much (if any) additional knowledge about data types.<br>
<br>
(3) Make date and time functions that are friendly to users. That means having fewer functions with parameters<br>
instead of lots of very similar functions. Also, include useful utility functions that allow common date manipulations,<br>
such as extracting parts of temporal values (for partitioning) and finding the beginning and end of days, months, and quarters.<br>
<br>
(4) Make date and time manipulations more durable. If formatting is slightly different for you shouldn't have<br>
to do a lot of work to compensate. If your data looks like it could be a datetime to the<br>
eyeball, you should be able to use it for data processing.<br>
<br>
(5) Leverage the best APIs from procedural and query based languages and not reinvent the wheel. Use existing <br>
code whenever possible and take advantage of platform-specific niceties. Elements of Python, <br>
Transact-SQL, and PL/SQL were leveraged for back- and front-end work.<br>
<br>
Usage<br>
---------<br>
<br>
Much of DTTM is designed to which is to have a single function with parameters to specify <br>
how work should be done. For example, there is one function called date_diff that has a parameter (datepart)<br>
that is used to tell what units should be returned. This is much easier fo end users to remember and use than<br>
something like one function per unit (date_diff_seconds, date_diff_minutes, date_diff_hours, etc.).<br>
<br>
In actual operation, the functions that get used the most are: <br>
<br>
* <a href="#-parse_temporal">parse_temporal</a>(), which is used implicitly used by every other function.<br>
* Manipulation functions (<a href="#-date_add">date_add</a>(), <a href="#-date_diff">date_diff</a>(), <a href="#-date_trunc">date_trunc</a>(), <a href="#-date_start_of">date_start_of</a>(), <a href="#-date_end_of">date_end_of</a>(), <a href="#-date_name">date_name</a>()) functions.<br>
* <a href="#-today">today</a>() and <a href="#-now">now</a>() <br>
<br>
There is a common set of string constants that are used across all of the manipulation functions through<br>
the datepart variable:<br>
<br>
'year', 'yy', 'yyyy': The numeric calendar year<br>
'quarter', 'qq', 'q': The numeric calendar quarter (1-4)<br>
'month', 'mm', 'm': The numeric calendar month (1-12)<br>
'day_of_year', 'dy', 'y': The day (1-366) of the year.<br>
'day_name', 'dn': The name ('Sunday') of the day of the week<br>
'day', 'dd', 'd': The numeric day of the month.<br>
'week', 'wk', 'ww': The numeric week of the year.<br>
'weekday', 'dw': The numeric day of the week<br>
'day_of_week', 'dow': The numeric day of the week (1-7)<br>
'hour', 'hh': The numeric hour of the day (0-23)<br>
'minute', 'mi', 'n': The numeric minute of the hour (0-59)<br>
'second', 'ss', 's': The numeric second of the minute (0-59)<br>
'microsecond', 'mcs': The numeric microsecond of the second (0-1000000)<br>
'epoch', 'unix', 'ep': The numeric number of seconds since 1970-01-01 00:00:00<br>
'TZoffset', 'tz': The time zone offset.<br>
'ISO_WEEK', 'iso_wk', 'isoww': The numeric week of the year, as defined by ISO standards.<br>
<br>
All values may not be able to be used in each function, as they may or may not make sense. For example,<br>
it does not make sense to truncate a temporal value to the microsecond, as this is the lowest increment of<br>
time used with temporal values. <br>
<br>
Notes<br>
---------<br>
<br>
(1) Internally, DTTM is done in Python, and would first be implemented in Pig using Jython. I understand that<br>
these could be done using Java, but the weight of the language is simply too much for me to bear for<br>
what should be simple functionality.<br>
<br>
(2) When using DTTM functions, you can simply specify your temporal values in a string without a particular<br>
format. The library is set up so that it will try to convert any text to a proper datetime value, using<br>
the totally awesome Python dateutil library and parser. A temporal value could be anything from "12/31/1999" to <br>
"Today is 25 of September of 2003, exactly at 10:49:41 with timezone -03:00." and it would be usable.<br>
<br>
(3) This library is initially intended for PIG, but may be extended to other Hadoop projects as opportunites arise.<br>
<br>
(4) As mentioned before, this library depends on the python datetime and dateutil libraries. They must be installed<br>
and available in your Jython Path across your cluster.</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="dateutil.html">dateutil</a><br>
</td><td width="25%" valign=top><a href="dateutil.parser.html">dateutil.parser</a><br>
</td><td width="25%" valign=top><a href="time.html">time</a><br>
</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#eeaa77">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt> </tt></td><td> </td>
<td width="100%"><dl><dt><a name="-date_add"><strong>date_add</strong></a>(date_part, number, input_text)</dt><dd><tt>Returns a character string representing the the datetime with a certain number of units added to it. <br>
<br>
Notes:<br>
<br>
(1) This is a useful function seen in T-SQL. See <a href="http://msdn.microsoft.com/en-us/library/ms189794.aspx">http://msdn.microsoft.com/en-us/library/ms189794.aspx</a> for more details.<br>
<br>
Parameters:<br>
<br>
date_part: a text string containing an english name of the part that should be returned. This could be <br>
something like 'year' or 'hour' or an abbreviation like 'wk' or 'qq' (see notes for a full list).<br>
number: the number to add to the datetime. This can be positive or negative.<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
A string containing the particular part of the datetime (if valid) or an empty string (if invalid).</tt></dd></dl>
<dl><dt><a name="-date_diff"><strong>date_diff</strong></a>(date_part, start_text, end_text)</dt><dd><tt>Returns a character string representing the specific part of the difference between two specified datetimes. While<br>
it primarily parts out logic to other functions, everything returned from this function will<br>
be formatted as a character string, making for more consistent handling.<br>
<br>
Notes:<br>
<br>
(1) This is a useful function seen in T-SQL. See <a href="http://msdn.microsoft.com/en-us/library/ms189794.aspx">http://msdn.microsoft.com/en-us/library/ms189794.aspx</a> for more details.<br>
<br>
<br>
Parameters:<br>
<br>
date_part: a text string containing an english name of the part that should be returned. This could be <br>
something like 'year' or 'hour' or an abbreviation like 'wk' or 'qq' (see notes for a full list).<br>
start_text: a string with a datetime value representing the start of the period.<br>
end_text: a string with a datetime value representing the end of the period..<br>
<br>
Returns:<br>
<br>
A string containing the particular part of the datetime (if valid) or an empty string (if invalid).</tt></dd></dl>
<dl><dt><a name="-date_end_of"><strong>date_end_of</strong></a>(date_part, input_text)</dt><dd><tt>Returns a datetime representing the last second of the time period containing the datetime specified. <br>
<br>
Notes:<br>
<br>
(1) This can be combined nicely with the date_start_of function to isolate a range of values.<br>
<br>
Parameters:<br>
<br>
date_part: a text string containing an english name of the part that should be returned. This could be <br>
something like 'year' or 'hour' or an abbreviation like 'wk' or 'qq' (see notes for a full list).<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
A string containing the particular part of the datetime (if valid) or an empty string (if invalid).</tt></dd></dl>
<dl><dt><a name="-date_name"><strong>date_name</strong></a>(date_part, input_text)</dt><dd><tt>Returns a character string representing the specific part of the specified datetime. While<br>
it primarily parts out logic to other functions, everything returned from this function will<br>
be formatted as a character string, making for more consistent handling.<br>
<br>
Notes:<br>
<br>
(1) This is a useful function seen in T-SQL. See <a href="http://msdn.microsoft.com/en-us/library/ms174395.aspx">http://msdn.microsoft.com/en-us/library/ms174395.aspx</a> for more details.<br>
<br>
Parameters:<br>
<br>
date_part: a text string containing an english name of the part that should be returned. This could be <br>
something like 'year' or 'hour' or an abbreviation like 'wk' or 'qq' (see notes for a full list).<br>
input_text: a string with a datetime value.<br>
<br>
Returns:<br>
<br>
A string containing the particular part of the datetime (if valid) or an empty string (if invalid).</tt></dd></dl>
<dl><dt><a name="-date_start_of"><strong>date_start_of</strong></a>(date_part, input_text)</dt><dd><tt>A synonym for the date_trunc function.<br>
<br>
Parameters:<br>
<br>
date_part: a text string containing an english name of the part that should be returned. This could be <br>
something like 'year' or 'hour' or an abbreviation like 'wk' or 'qq' (see notes for a full list).<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
A string containing the particular part of the datetime (if valid) or an empty string (if invalid).</tt></dd></dl>
<dl><dt><a name="-date_trunc"><strong>date_trunc</strong></a>(date_part, input_text)</dt><dd><tt>Truncates a datetime down to the unit specified. All precision below the date_part will be removed.<br>
<br>
Notes:<br>
<br>
(1) This is a useful function seen in Oracle, Postgres, and others. See <a href="http://msdn.microsoft.com/en-us/library/ms189794.aspx">http://msdn.microsoft.com/en-us/library/ms189794.aspx</a> for more details.<br>
<br>
Parameters:<br>
<br>
date_part: a text string containing an english name of the part that should be returned. This could be <br>
something like 'year' or 'hour' or an abbreviation like 'wk' or 'qq' (see notes for a full list).<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
A string containing the particular part of the datetime (if valid) or an empty string (if invalid).</tt></dd></dl>
<dl><dt><a name="-day"><strong>day</strong></a>(input_text)</dt><dd><tt>Get the day for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the day (1-31).</tt></dd></dl>
<dl><dt><a name="-day_name"><strong>day_name</strong></a>(input_text)</dt><dd><tt>Get the day of the week as text for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An string with the text name of the day of the week.</tt></dd></dl>
<dl><dt><a name="-day_of_week"><strong>day_of_week</strong></a>(input_text)</dt><dd><tt>Get the numeric day of the week for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the week (1-7).</tt></dd></dl>
<dl><dt><a name="-day_of_year"><strong>day_of_year</strong></a>(input_text)</dt><dd><tt>Get the day of the year for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the day of the year (1-366).</tt></dd></dl>
<dl><dt><a name="-epoch"><strong>epoch</strong></a>(input_text)</dt><dd><tt>Get the UNIX datetime for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
A long with the number of seconds.</tt></dd></dl>
<dl><dt><a name="-hour"><strong>hour</strong></a>(input_text)</dt><dd><tt>Get the numeric hour of the day for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the hour (0-23).</tt></dd></dl>
<dl><dt><a name="-iso_week"><strong>iso_week</strong></a>(input_text)</dt><dd><tt>Get the ISO defined week of the year for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the week (1-53).</tt></dd></dl>
<dl><dt><a name="-microsecond"><strong>microsecond</strong></a>(input_text)</dt><dd><tt>Get the numeric microsoecond for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the hour (0-1000000).</tt></dd></dl>
<dl><dt><a name="-minute"><strong>minute</strong></a>(input_text)</dt><dd><tt>Get the numeric minute of the hour for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the hour (0-59).</tt></dd></dl>
<dl><dt><a name="-month"><strong>month</strong></a>(input_text)</dt><dd><tt>Get the month for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the month (1-12).</tt></dd></dl>
<dl><dt><a name="-now"><strong>now</strong></a>()</dt><dd><tt>A function to return the current date and time. This can be combined nicely with date_add for ranges.<br>
<br>
Parameters:<br>
<br>
Returns:<br>
<br>
A string containing the date and time when this function was called.</tt></dd></dl>
<dl><dt><a name="-parse_formatted_temporal"><strong>parse_formatted_temporal</strong></a>(input_text, input_format<font color="#909090">='%Y-%m-%d %H:%M:%S'</font>)</dt><dd><tt>Returns a datetime from the string. You cannot make an invalid datetime with this function.<br>
<br>
Parameters:<br>
<br>
input_text: an integer, defaults to 1970<br>
input_format: a text string that can be used by Python to interpret input_text properly.<br>
<br>
NOTE:<br>
<br>
For more dtails on input_format, see the Python documentation for the strptime function at<br>
<a href="http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior">http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior</a><br>
<br>
Returns:<br>
<br>
A python datetime (if called from Python) or a string containing an ISO formatted date time (if called from Pig).</tt></dd></dl>
<dl><dt><a name="-parse_temporal"><strong>parse_temporal</strong></a>(input_text)</dt><dd><tt>Returns a valid python datetime object and returns it as a string. It will attempt to automatically <br>
format the input string and will throw an exception if it cannot.<br>
<br>
This function is really the heart of the package. Virtually every other function calls this<br>
to build a working datetime value. Working with unstructured data means that we don't necesarily<br>
have perfectly formatted data, especially for temporal data. This function helps us work with <br>
data that is most likely in string form (or can easily be converted) and get something useful<br>
out the other end.<br>
<br>
NOTE: <br>
<br>
This function is jus a wrapper around most excellent Python dateutils.parser, which allows<br>
you to provide dates in a free-form manner. You don't have to specify a string to tell<br>
this function what your date/time value looks like, you can simply provide the information<br>
as a text string and it will figure out the rest. <br>
<br>
See <a href="http://labix.org/python-dateutil#head-1443e0f14ad5dff07efd465e080d1110920673d8-2">http://labix.org/python-dateutil#head-1443e0f14ad5dff07efd465e080d1110920673d8-2</a> for<br>
examples of the different date and time formats that can be used. It could be anything from<br>
"12/31/1999" to "Today is 25 of September of 2003, exactly at 10:49:41 with timezone -03:00."<br>
<br>
If you really want to provide a specific format, use the <a href="#-parse_formatted_temporal">parse_formatted_temporal</a>() <br>
or <a href="#-temporal_from_parts">temporal_from_parts</a>() functions instead. However, this function is much easier to use.<br>
<br>
Parameters:<br>
<br>
input_text, a string containing a datetime value.<br>
<br>
Returns:<br>
<br>
A python datetime (if called from Python) or a string containing an ISO formatted date time (if called from Pig).</tt></dd></dl>
<dl><dt><a name="-quarter"><strong>quarter</strong></a>(input_text)</dt><dd><tt>Get the quarter for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the quarter (1-4).</tt></dd></dl>
<dl><dt><a name="-second"><strong>second</strong></a>(input_text)</dt><dd><tt>Get the numeric second of the minute for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the second (0-59).</tt></dd></dl>
<dl><dt><a name="-temporal_from_parts"><strong>temporal_from_parts</strong></a>(year<font color="#909090">=1970</font>, month<font color="#909090">=1</font>, day<font color="#909090">=1</font>, hour<font color="#909090">=0</font>, minute<font color="#909090">=0</font>, second<font color="#909090">=0</font>, microsecond<font color="#909090">=0</font>)</dt><dd><tt>Returns a datetime from the parts provided. Default value is the epoch of '1970-01-01 00:00:00'<br>
You cannot make an invalid datetime with this function.<br>
<br>
Parameters:<br>
<br>
year: an integer, defaults to 1970<br>
month, an integer [1-12], defaults to 1<br>
day, an integer [1-31], defaults to 1<br>
hour, an integer [0-23], defaults to 0<br>
minute, an integer [0-59], defaults to 0<br>
second, an integer [0-59], defaults to 0<br>
<br>
Returns:<br>
<br>
A python datetime (if called from Python) or a string containing an ISO formatted date time (if called from Pig).</tt></dd></dl>
<dl><dt><a name="-today"><strong>today</strong></a>()</dt><dd><tt>A function to return today's date. This can be combined nicely with date_add for ranges.<br>
<br>
Parameters:<br>
<br>
Returns:<br>
<br>
A string containing todays date.</tt></dd></dl>
<dl><dt><a name="-tz_offset"><strong>tz_offset</strong></a>(input_text)</dt><dd><tt>Get the timezone offset for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An string with the offset</tt></dd></dl>
<dl><dt><a name="-week"><strong>week</strong></a>(input_text)</dt><dd><tt>Get the week of the year for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the week (1-52).</tt></dd></dl>
<dl><dt><a name="-year"><strong>year</strong></a>(input_text)</dt><dd><tt>Get the year for a particular temporal value.<br>
<br>
Parameters:<br>
<br>
input_text: a string with a datetime value representing the temporal value to be manipulated.<br>
<br>
Returns:<br>
<br>
An integer with the year.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
<td width="100%"><strong>DAILY</strong> = 3<br>
<strong>FR</strong> = FR<br>
<strong>HOURLY</strong> = 4<br>
<strong>MAXYEAR</strong> = 9999<br>
<strong>MINUTELY</strong> = 5<br>
<strong>MINYEAR</strong> = 1<br>
<strong>MO</strong> = MO<br>
<strong>MONTHLY</strong> = 1<br>
<strong>SA</strong> = SA<br>
<strong>SECONDLY</strong> = 6<br>
<strong>SU</strong> = SU<br>
<strong>TH</strong> = TH<br>
<strong>TU</strong> = TU<br>
<strong>WE</strong> = WE<br>
<strong>WEEKLY</strong> = 2<br>
<strong>YEARLY</strong> = 0<br>
<strong>datetime_CAPI</strong> = <capsule object "datetime.datetime_CAPI"><br>
<strong>rrulestr</strong> = <dateutil.rrule._rrulestr instance></td></tr></table>
</body></html>