1from datetime import datetime, time 2from dateutil import parser 3from ..type import Type 4from .. import settings 5 6 7class TimeType(Type): 8 """Time type implementation. 9 10 API | Usage 11 -------- | -------- 12 Public | `from frictionless import types` 13 14 """ 15 16 code = "time" 17 builtin = True 18 constraints = [ 19 "required", 20 "minimum", 21 "maximum", 22 "enum", 23 ] 24 25 # Read 26 27 def read_cell(self, cell): 28 if not isinstance(cell, time): 29 if not isinstance(cell, str): 30 return None 31 try: 32 if self.field.format == "default": 33 # Guard against shorter formats supported by dateutil 34 assert cell[5] == ":" 35 assert len(cell) >= 8 36 cell = parser.isoparse(f"2000-01-01T{cell}").timetz() 37 elif self.field.format == "any": 38 cell = parser.parse(cell).timetz() 39 else: 40 cell = datetime.strptime(cell, self.field.format).timetz() 41 except Exception: 42 return None 43 return cell 44 45 # Write 46 47 def write_cell(self, cell): 48 format = self.field.get("format", settings.DEFAULT_TIME_PATTERN) 49 cell = cell.strftime(format) 50 cell = cell.replace("+0000", "Z") 51 return cell 52