-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathweatherdata_utils.py
85 lines (72 loc) · 2.77 KB
/
weatherdata_utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import urllib.request as http
import xml.etree.ElementTree as ET
import datetime as dt
from email.utils import parsedate_to_datetime
class WeatherStation:
'''Handles connection to weather station feed
and extraction of temperature,pressure and humidity from raw response'''
def __init__(self,url):
self.__id__ = None
self.__timeupdated__ = dt.datetime(1960,1,1,tzinfo=dt.timezone.utc)#initialized to a date in the past
self.__temp__ = None
self.__pressure__ = None
self.__humidity__ = None
self.__windspeed__ = None
self.__url__ = url
self.raw=""
def update(self):
#get raw data from url
try:
rawtxt = http.urlopen(self.__url__).read()
except:
print('Couldn\'t Open URL.')
return False
self.raw = rawtxt
#parse xml to get data
try:
(ID,
temp,
pressure,
humidity,
timeupdated,
windspeed)= newData = self.__parse__(rawtxt)
except:
print('Parsing Error, Data was either missing or in an unexpected format.')
return False
#update if the data is new
if timeupdated > self.__timeupdated__:
(self.__id__,
self.__temp__,
self.__pressure__,
self.__humidity__,
self.__timeupdated__,
self.__windspeed__) = newData
return True
else:
return False
def __parse__(self,raw):
tree = ET.fromstring(raw)
str_id = [i for i in tree.find('station_id').itertext() ][0]
str_temp_f = [i for i in tree.find('temp_f').itertext() ][0]
str_pressure_mb = [i for i in tree.find('pressure_mb').itertext() ][0]
str_relative_humidity = [i for i in tree.find('relative_humidity').itertext()][0]
str_time = [i for i in tree.find('observation_time_rfc822').itertext()][0]
str_wind_speed = [i for i in tree.find('wind_mph').itertext() ][0]
return (str_id,
float(str_temp_f ),
float(str_pressure_mb ),
float(str_relative_humidity),
parsedate_to_datetime(str_time),
float(str_wind_speed))
def ID(self):
return self.__id__
def temp(self):
return self.__temp__
def pressure(self):
return self.__pressure__
def humidity(self):
return self.__humidity__
def time(self):
return self.__timeupdated__
def wind_speed(self):
return self.__windspeed__