Source code for uwg.weather
"""Class for Weather data from EPW."""
from .utilities import read_csv, str2fl
from .psychrometrics import hum_from_rhum_temp
try:
range = xrange
except NameError:
pass
[docs]
class Weather(object):
"""Read EPW file[1] and store weather timeseries data.
Args:
climate_file: Text string for the name of the rural epw file that will be
morphed.
HI: Number for initial EPW row based on final Julian data.
HF: Number for final EPW row based on start Julian data.
Properties:
* location -- location row from EPW file.
* staTemp -- drybulb (K)
* staTdp -- dewpoint (C)
* staRhum -- air RH (%)
* staPres -- air pressure (Pa)
* staInfra -- horizontal Infrared Radiation Intensity (W m-2)
* staHor -- horizontal radiation [W m-2]
* staDir -- normal solar direct radiation (W m-2)
* staDif -- horizontal solar diffuse radiation (W m-2)
* staUdir -- wind direction
* staUmod -- wind speed (m s-1)
* staRobs -- precipitation (mm h-1)
* staHum -- specific humidty (kgH20 kgN202-1)
Note:
[1] EPW CSV Format (In/Out). Retrieved August 26, 2020,
from http://bigladdersoftware.com/epx/docs/8-2/auxiliary-programs/epw-csv-format-inout.html
"""
def __init__(self, epw_path, HI, HF):
try:
self._climate_data = read_csv(epw_path)
except Exception as e:
raise Exception("Failed to read .epw file! {}".format(e.message))
self.location = self._climate_data[0][1]
cd = self._climate_data[HI:HF + 1]
self.staTemp = str2fl([cd[i][6] for i in range(len(cd))])
self.staTdp = str2fl([cd[i][7] for i in range(len(cd))])
self.staRhum = str2fl([cd[i][8] for i in range(len(cd))])
self.staPres = str2fl([cd[i][9] for i in range(len(cd))])
# staInfra:
self.staInfra = str2fl([cd[i][12] for i in range(len(cd))])
# staHor:
self.staHor = str2fl([cd[i][13] for i in range(len(cd))])
# staDir:
self.staDir = str2fl([cd[i][14] for i in range(len(cd))])
# staDif:
self.staDif = str2fl([cd[i][15] for i in range(len(cd))])
self.staUdir = str2fl([cd[i][20] for i in range(len(cd))])
self.staUmod = str2fl([cd[i][21] for i in range(len(cd))])
self.staHum = [0.0] * len(self.staTemp)
for i in range(len(self.staTemp)):
self.staHum[i] = \
hum_from_rhum_temp(self.staRhum[i], self.staTemp[i], self.staPres[i])
self.staTemp = [s + 273.15 for s in self.staTemp] # air temperature (K)
# Set precipitation to array of zeros. This is done to avoid errors
# for EPW files with incomplete or missing precipitation data. The
# current implementation of the UWG doesn't use precipitation data
# due to the difficulty in validating latent heat impact, the poor
# quality precipitation data from weather sensors, and the marginal
# impact it has on UHI.
self.staRobs = [0.0] * len(self.staTemp)
def __repr__(self):
return 'Weather,\n City: {}\n, Max Tdb: {}C\n, Min Tdb: {}C\n'.format(
self.location, round(max(self.staTemp) - 273.15, 2),
round(min(self.staTemp) - 273.15, 2))