Source code for pyowm.weatherapi25.stationhistory
"""
Module containing classes and datastructures related to meteostation history
data
"""
import json
import xml.etree.ElementTree as ET
from pyowm.weatherapi25.xsd.xmlnsconfig import (
STATION_HISTORY_XMLNS_PREFIX, STATION_HISTORY_XMLNS_URL)
from pyowm.utils import timeformatutils, xmlutils
[docs]class StationHistory(object):
"""
A class representing historic weather measurements collected by a
meteostation. Three types of historic meteostation data can be obtained by
the OWM Weather API: ticks (one data chunk per minute) data, hourly and daily
data.
:param station_ID: the numeric ID of the meteostation
:type station_ID: int
:param interval: the time granularity of the meteostation data history
:type interval: str
:param reception_time: GMT UNIXtime of the data reception from the OWM web
API
:type reception_time: int
:param measurements: a dictionary containing raw weather measurements
:type measurements: dict
:returns: a *StationHistory* instance
:raises: *ValueError* when the supplied value for reception time is
negative
"""
def __init__(self, station_ID, interval, reception_time, measurements):
self._station_ID = station_ID
self._interval = interval
if reception_time < 0:
raise ValueError("'reception_time' must be greater than 0")
self._reception_time = reception_time
self._measurements = measurements
[docs] def get_station_ID(self):
"""
Returns the ID of the meteostation
:returns: the int station ID
"""
return self._station_ID
[docs] def set_station_ID(self, station_ID):
"""
Sets the numeric ID of the meteostation
:param station_ID: the numeric ID of the meteostation
:type station_ID: int
"""
self._station_ID = station_ID
[docs] def get_interval(self):
"""
Returns the interval of the meteostation history data
:returns: the int interval
"""
return self._interval
[docs] def set_interval(self, interval):
"""
Sets the interval of the meteostation history data
:param interval: the time granularity of the meteostation history data,
may be among "tick","hour" and "day"
:type interval: string
"""
self._interval = interval
[docs] def get_measurements(self):
"""
Returns the measurements of the meteostation as a dict. The dictionary
keys are UNIX timestamps and for each one the value is a dict
containing the keys 'temperature','humidity','pressure','rain','wind'
along with their corresponding numeric values.
Eg: ``{1362933983: { "temperature": 266.25, "humidity": 27.3,
"pressure": 1010.02, "rain": None, "wind": 4.7}, ... }``
:returns: the dict containing the meteostation's measurements
"""
return self._measurements
[docs] def get_reception_time(self, timeformat='unix'):
"""Returns the GMT time telling when the meteostation history data was
received from the OWM Weather API
:param timeformat: the format for the time value. May be:
'*unix*' (default) for UNIX time
'*iso*' for ISO8601-formatted string in the format ``YYYY-MM-DD HH:MM:SS+00``
'*date* for ``datetime.datetime`` object instance
:type timeformat: str
:returns: an int or a str
:raises: ValueError
"""
return timeformatutils.timeformat(self._reception_time, timeformat)
[docs] def to_JSON(self):
"""Dumps object fields into a JSON formatted string
:returns: the JSON string
"""
return json.dumps({"station_ID": self._station_ID,
"interval": self._interval,
"reception_time": self._reception_time,
"measurements": self._measurements
})
[docs] def to_XML(self, xml_declaration=True, xmlns=True):
"""
Dumps object fields to an XML-formatted string. The 'xml_declaration'
switch enables printing of a leading standard XML line containing XML
version and encoding. The 'xmlns' switch enables printing of qualified
XMLNS prefixes.
:param XML_declaration: if ``True`` (default) prints a leading XML
declaration line
:type XML_declaration: bool
:param xmlns: if ``True`` (default) prints full XMLNS prefixes
:type xmlns: bool
:returns: an XML-formatted string
"""
root_node = self._to_DOM()
if xmlns:
xmlutils.annotate_with_XMLNS(root_node,
STATION_HISTORY_XMLNS_PREFIX,
STATION_HISTORY_XMLNS_URL)
return xmlutils.DOM_node_to_XML(root_node, xml_declaration)
def _to_DOM(self):
"""
Dumps object data to a fully traversable DOM representation of the
object.
:returns: a ``xml.etree.Element`` object
"""
root_node = ET.Element("station_history")
station_id_node = ET.SubElement(root_node, "station_id")
station_id_node.text = str(self._station_ID)
interval_node = ET.SubElement(root_node, "interval")
interval_node.text = self._interval
reception_time_node = ET.SubElement(root_node, "reception_time")
reception_time_node.text = str(self._reception_time)
measurements_node = ET.SubElement(root_node, "measurements")
for m in self._measurements:
d = self._measurements[m].copy()
d['reference_time'] = m
xmlutils.create_DOM_node_from_dict(d, "measurement",
measurements_node)
return root_node
def __len__(self):
return len(self._measurements)
def __repr__(self):
return '<%s.%s - station ID=%s, reception time=%s, interval=%s, ' \
'measurements:%s>' % (__name__, self.__class__.__name__,
self._station_ID,
self.get_reception_time('iso'),
self._interval, str(len(self))
)