Skip to content

Instantly share code, notes, and snippets.

@BrianLusina
Last active January 13, 2017 20:48
Show Gist options
  • Save BrianLusina/acb28848f1e9a336e12465d424344aab to your computer and use it in GitHub Desktop.
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
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
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