Last active
January 13, 2017 20:48
-
-
Save BrianLusina/acb28848f1e9a336e12465d424344aab to your computer and use it in GitHub Desktop.
Read data from Weather.dat file, fetch the day with the largest spread
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Dy MxT MnT AvT HDDay AvDP 1HrP TPcpn WxType PDir AvSp Dir MxS SkyC MxR MnR AvSLP | |
1 88 59 74 53.8 0.00 F 280 9.6 270 17 1.6 93 23 1004.5 | |
2 79 63 71 46.5 0.00 330 8.7 340 23 3.3 70 28 1004.5 | |
3 77 55 66 39.6 0.00 350 5.0 350 9 2.8 59 24 1016.8 | |
4 77 59 68 51.1 0.00 110 9.1 130 12 8.6 62 40 1021.1 | |
5 90 66 78 68.3 0.00 TFH 220 8.3 260 12 6.9 84 55 1014.4 | |
6 81 61 71 63.7 0.00 RFH 030 6.2 030 13 9.7 93 60 1012.7 | |
7 73 57 65 53.0 0.00 RF 050 9.5 050 17 5.3 90 48 1021.8 | |
8 75 54 65 50.0 0.00 FH 160 4.2 150 10 2.6 93 41 1026.3 | |
9 86 32* 59 6 61.5 0.00 240 7.6 220 12 6.0 78 46 1018.6 | |
10 84 64 74 57.5 0.00 F 210 6.6 050 9 3.4 84 40 1019.0 | |
11 91 59 75 66.3 0.00 H 250 7.1 230 12 2.5 93 45 1012.6 | |
12 88 73 81 68.7 0.00 RTH 250 8.1 270 21 7.9 94 51 1007.0 | |
13 70 59 65 55.0 0.00 H 150 3.0 150 8 10.0 83 59 1012.6 | |
14 61 59 60 5 55.9 0.00 RF 060 6.7 080 9 10.0 93 87 1008.6 | |
15 64 55 60 5 54.9 0.00 F 040 4.3 200 7 9.6 96 70 1006.1 | |
16 79 59 69 56.7 0.00 F 250 7.6 240 21 7.8 87 44 1007.0 | |
17 81 57 69 51.7 0.00 T 260 9.1 270 29* 5.2 90 34 1012.5 | |
18 82 52 67 52.6 0.00 230 4.0 190 12 5.0 93 34 1021.3 | |
19 81 61 71 58.9 0.00 H 250 5.2 230 12 5.3 87 44 1028.5 | |
20 84 57 71 58.9 0.00 FH 150 6.3 160 13 3.6 90 43 1032.5 | |
21 86 59 73 57.7 0.00 F 240 6.1 250 12 1.0 87 35 1030.7 | |
22 90 64 77 61.1 0.00 H 250 6.4 230 9 0.2 78 38 1026.4 | |
23 90 68 79 63.1 0.00 H 240 8.3 230 12 0.2 68 42 1021.3 | |
24 90 77 84 67.5 0.00 H 350 8.5 010 14 6.9 74 48 1018.2 | |
25 90 72 81 61.3 0.00 190 4.9 230 9 5.6 81 29 1019.6 | |
26 97* 64 81 70.4 0.00 H 050 5.1 200 12 4.0 107 45 1014.9 | |
27 91 72 82 69.7 0.00 RTH 250 12.1 230 17 7.1 90 47 1009.0 | |
28 84 68 76 65.6 0.00 RTFH 280 7.6 340 16 7.0 100 51 1011.0 | |
29 88 66 77 59.7 0.00 040 5.4 020 9 5.3 84 33 1020.6 | |
30 90 45 68 63.6 0.00 H 240 6.0 220 17 4.8 200 41 1022.7 | |
mo 82.9 60.5 71.7 16 58.8 0.00 6.9 5.3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class WeatherData(object): | |
def __init__(self): | |
# open and read the file | |
weather_file = open("weather.dat") | |
with weather_file as data: | |
rows = [] | |
# get all the rows and store them in a list | |
for line in data.readlines(): | |
elem = line.split() | |
rows.append(elem) | |
self.rows = rows | |
# record to keep track of the spreads | |
self.spread_data = {} | |
def calculate_spread(self): | |
""" | |
Calculates the spread for each day in the weather data | |
Will populate spread data,a dictionary with each day's spread already calculated, | |
the spread is the value, the day is the key | |
""" | |
# mark the header columns they will be used as indices | |
headers = self.rows[0] | |
# acquire the index of Dy, MxT and Mnt | |
dy_indx = headers.index("Dy") | |
mxt_indx = headers.index("MxT") | |
mnt_indx = headers.index("MnT") | |
# loop through the data, getting the spread | |
# skip the header | |
for x in range(1, len(self.rows[1:])): | |
# current row | |
row = self.rows[x] | |
# current day | |
row_day = row[dy_indx] | |
# clean data and return the clean values for max temp and min temp | |
mx, mn = self.clean_data(row[mxt_indx], row[mnt_indx]) | |
# get the spread | |
spread = mx - mn | |
self.spread_data[row_day] = spread | |
def get_spread(self): | |
""" | |
Evaluates which is the highest spread and from which day that is | |
:return: day and spread as a tuple | |
:rtype: tuple | |
""" | |
spreads = self.spread_data.values() | |
# get the maximum spread | |
mx_spread = max(spreads) | |
for k, v in self.spread_data.items(): | |
if v == mx_spread: | |
return k, v | |
def clean_data(self, mx, mn): | |
""" | |
Cleans the data removing unwanted characters such as +="£$%^&*()_/*-+. from the numbers | |
Gets the character that is a digit from the string and adds it to the final clean result | |
:param mx: maximum temperature as a string | |
:param mn: minimum temperature as a string | |
:return: A tuple with the 1st index as max temp, 2nd as min temp | |
:rtype: tuple | |
""" | |
# list comprehension to return only digits | |
clean_min = "".join(char for char in mn if char.isdigit()) | |
clean_max = "".join(char for char in mx if char.isdigit()) | |
return int(clean_max), int(clean_min) | |
def main(): | |
weather_data = WeatherData() | |
# calculate the spread | |
weather_data.calculate_spread() | |
# print to stdout | |
print(weather_data.get_spread()) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment