docs: def fromPattern(cls, datetime_string, datetime_pattern, time_zone, require_hour=True):
  
          '''
              a method for constructing labDT from a strptime pattern in a string
              https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
              iso_pattern: '%Y-%m-%dT%H:%M:%S.%f%z'
              human_friendly_pattern: '%A, %B %d, %Y %I:%M:%S.%f%p'
          :param datetime_string: string with date and time info
          :param datetime_pattern: string with python formatted pattern
          :param time_zone: string with timezone info
          :param require_hour: [optional] boolean to disable hour requirement
          :return: labDT object with datetime
          '''
  
      # validate inputs
          title = 'input for labDT.fromPattern'
          dT_req = [['%Y','%y'],['%b','%B','%m'],['%d'],['%H','%I']]
          req_counter = 0
          for i in dT_req:
              for j in i:
                  if j in datetime_pattern:
                      req_counter += 1
          if not req_counter == 4 and require_hour:
              raise Exception('Datetime pattern %s must contain at least year, month, day and hour.' % title)
          try:
              get_tz = tz.gettz(time_zone)
          except:
              raise ValueError('Timezone %s is not a valid timezone format.' % title)
  
      # decipher datetime
          python_datetime = datetime.strptime(datetime_string, datetime_pattern)
          python_datetime = python_datetime.replace(tzinfo=tz.gettz(time_zone))
          dT = python_datetime.astimezone(pytz.utc)
          dt_kwargs = {
              'year': dT.year,
              'month': dT.month,
              'day': dT.day,
              'hour': dT.hour,
              'minute': dT.minute,
              'second': dT.second,
              'microsecond': dT.microsecond,
              'tzinfo': dT.tzinfo
          }
          return labDT(**dt_kwargs)