def weather(self, latitude=None, longitude=None, date=None):
        # type:(float, float, datetime) -> Weather
        """
        :param float latitude: Locations latitude
        :param float longitude: Locations longitude
        :param datetime or str or int date: Date/time for historical weather data

        :raises requests.exceptions.HTTPError: Raises on bad http response
        :raises TypeError: Raises on invalid param types

        :rtype: Weather

        Example uses

        .. code-block:: python

            # DarkSky instantiation
            >>> darksky = pydarksky.DarkSky(api_key)

            # Pre-define values
            >>> darksky.latitude = -34.9285
            >>> darksky.longitude = 138.6005
            >>> weather = darksky.weather()

            # Pass values as params
            >>> weather = darksky.weather(latitude=-34.9285, longitude=138.6005)

            # Pass values from dict
            >>> kwargs = {"longitude": 138.6005, "latitude": -34.9285}
            >>> weather = darksky.weather(**kwargs)
        """

        # If params are default(None) check if latitude/longitude have already been defined(Not None)
        # Otherwise TypeError is raised
        if latitude is None:
            if self.latitude is None:
                raise TypeError("latitude must be type '<class 'str'>' is None")
        else:
            self.latitude = latitude

        if longitude is None:
            if self.longitude is None:
                raise TypeError("longitude must be type '<class 'str'>' is None")
        else:
            self.longitude = longitude

        self._date = date

        url = self.url

        log.debug(url)

        self._response = requests.get(url, headers={"Accept-Encoding": "gzip"}, timeout=5)
        self._response.raise_for_status()

        self._weather = Weather(self._response.text)
        return self._weather