docs: def from_string(cls, analysis_period_string):
          """Create an Analysis Period object from an analysis period string.
  
              %s/%s to %s/%s between %s and %s @%s
          """
          # %s/%s to %s/%s between %s to %s @%s*
          is_leap_year = True if analysis_period_string.strip()[-1] == '*' else False
          ap = analysis_period_string.lower().replace(' ', '') \
              .replace('to', ' ') \
              .replace('and', ' ') \
              .replace('/', ' ') \
              .replace('between', ' ') \
              .replace('@', ' ') \
              .replace('*', '')
          try:
              st_month, st_day, end_month, end_day, \
                  st_hour, end_hour, timestep = ap.split(' ')
              return cls(st_month, st_day, st_hour, end_month,
                         end_day, end_hour, int(timestep), is_leap_year)
          except Exception as e:
              raise ValueError(str(e))