docs: def from_zhang_huang_solar(cls, location, cloud_cover,
                                 relative_humidity, dry_bulb_temperature,
                                 wind_speed, atmospheric_pressure=None,
                                 timestep=1, is_leap_year=False, use_disc=False):
          """Create a wea object from climate data using the Zhang-Huang model.
  
          The Zhang-Huang solar model was developed to estimate solar
          irradiance for weather stations that lack such values, which are
          typically colleted with a pyranometer. Using total cloud cover,
          dry-bulb temperature, relative humidity, and wind speed as
          inputs the Zhang-Huang estimates global horizontal irradiance
          by means of a regression model across these variables.
          For more information on the Zhang-Huang model, see the
          EnergyPlus Engineering Reference:
          https://bigladdersoftware.com/epx/docs/8-7/engineering-reference/climate-calculations.html#zhang-huang-solar-model
  
          Args:
              location: Ladybug location object.
              cloud_cover: A list of annual float values between 0 and 1
                  that represent the fraction of the sky dome covered
                  in clouds (0 = clear; 1 = completely overcast)
              relative_humidity: A list of annual float values between
                  0 and 100 that represent the relative humidity in percent.
              dry_bulb_temperature: A list of annual float values that
                  represent the dry bulb temperature in degrees Celcius.
              wind_speed: A list of annual float values that
                  represent the wind speed in meters per second.
              atmospheric_pressure: An optional list of float values that
                  represent the atmospheric pressure in Pa.  If None or
                  left blank, pressure at sea level will be used (101325 Pa).
              timestep: An optional integer to set the number of time steps per
                  hour. Default is 1 for one value per hour.
              is_leap_year: A boolean to indicate if values are representing a leap year.
                  Default is False.
              use_disc: Set to True to use the original DISC model as opposed to the
                  newer and more accurate DIRINT model. Default is False.
          """
          # check input data
          assert len(cloud_cover) == len(relative_humidity) == \
              len(dry_bulb_temperature) == len(wind_speed), \
              'lengths of input climate data must match.'
          assert len(cloud_cover) / timestep == cls.hour_count(is_leap_year), \
              'input climate data must be annual.'
          assert isinstance(timestep, int), 'timestep must be an' \
              ' integer. Got {}'.format(type(timestep))
          if atmospheric_pressure is not None:
              assert len(atmospheric_pressure) == len(cloud_cover), \
                  'length pf atmospheric_pressure must match the other input lists.'
          else:
              atmospheric_pressure = [101325] * cls.hour_count(is_leap_year) * timestep
  
          # initiate sunpath based on location
          sp = Sunpath.from_location(location)
          sp.is_leap_year = is_leap_year
  
          # calculate parameters needed for zhang-huang irradiance
          date_times = []
          altitudes = []
          doys = []
          dry_bulb_t3_hrs = []
          for count, t_date in enumerate(cls._get_datetimes(timestep, is_leap_year)):
              date_times.append(t_date)
              sun = sp.calculate_sun_from_date_time(t_date)
              altitudes.append(sun.altitude)
              doys.append(sun.datetime.doy)
              dry_bulb_t3_hrs.append(dry_bulb_temperature[count - (3 * timestep)])
  
          # calculate zhang-huang irradiance
          dir_ir, diff_ir = zhang_huang_solar_split(altitudes, doys, cloud_cover,
                                                    relative_humidity,
                                                    dry_bulb_temperature,
                                                    dry_bulb_t3_hrs, wind_speed,
                                                    atmospheric_pressure, use_disc)
  
          # assemble the results into DataCollections
          metadata = {'source': location.source, 'country': location.country,
                      'city': location.city}
          direct_norm_rad, diffuse_horiz_rad = \
              cls._get_data_collections(dir_ir, diff_ir, metadata, timestep, is_leap_year)
  
          return cls(location, direct_norm_rad, diffuse_horiz_rad, timestep, is_leap_year)