Returns a TIME column as a timedelta object: >>> convert_timedelta('25:06:17') datetime.timedelta(days=1, seconds=3977) >>> convert_timedelta('-25:06:17') datetime.timedelta(days=-2, seconds=82423) Illegal values are returned as string: >>> convert_timedelta('ran
(obj)
| 192 | |
| 193 | |
| 194 | def convert_timedelta(obj): |
| 195 | """Returns a TIME column as a timedelta object: |
| 196 | |
| 197 | >>> convert_timedelta('25:06:17') |
| 198 | datetime.timedelta(days=1, seconds=3977) |
| 199 | >>> convert_timedelta('-25:06:17') |
| 200 | datetime.timedelta(days=-2, seconds=82423) |
| 201 | |
| 202 | Illegal values are returned as string: |
| 203 | |
| 204 | >>> convert_timedelta('random crap') |
| 205 | 'random crap' |
| 206 | |
| 207 | Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but |
| 208 | can accept values as (+|-)DD HH:MM:SS. The latter format will not |
| 209 | be parsed correctly by this function. |
| 210 | """ |
| 211 | if isinstance(obj, (bytes, bytearray)): |
| 212 | obj = obj.decode("ascii") |
| 213 | |
| 214 | m = TIMEDELTA_RE.match(obj) |
| 215 | if not m: |
| 216 | return obj |
| 217 | |
| 218 | try: |
| 219 | groups = list(m.groups()) |
| 220 | groups[-1] = _convert_second_fraction(groups[-1]) |
| 221 | negate = -1 if groups[0] else 1 |
| 222 | hours, minutes, seconds, microseconds = groups[1:] |
| 223 | |
| 224 | tdelta = ( |
| 225 | datetime.timedelta( |
| 226 | hours=int(hours), |
| 227 | minutes=int(minutes), |
| 228 | seconds=int(seconds), |
| 229 | microseconds=int(microseconds), |
| 230 | ) |
| 231 | * negate |
| 232 | ) |
| 233 | return tdelta |
| 234 | except ValueError: |
| 235 | return obj |
| 236 | |
| 237 | |
| 238 | TIME_RE = re.compile(r"(\d{1,2}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?") |
nothing calls this directly
no test coverage detected