def __test_clouds_from_short_wave(): date_list = [dt.date.today() - dt.timedelta(days=x) for x in range(0, 365)] date_list = [ dt.datetime.combine(d, dt.datetime.min.time()) for d in date_list ] date_list.reverse() # test Nordnesfjellet i Troms station_id = 91500 short_wave_id = 'QSI' long_wave_id = 'QLI' temperature_id = 'TA' timeseries_type = 2 utm_e = 711075 utm_n = 7727719 short_wave = gws.getMetData(station_id, short_wave_id, date_list[0], date_list[-1], timeseries_type) long_wave = gws.getMetData(station_id, long_wave_id, date_list[0], date_list[-1], timeseries_type) temperature = gws.getMetData(station_id, temperature_id, date_list[0], date_list[-1], timeseries_type) short_wave = we.fix_data_quick(short_wave) long_wave = we.fix_data_quick(long_wave) temperature_daily = we.fix_data_quick(temperature) short_wave_daily = we.make_daily_average(short_wave) short_wave_daily = we.multiply_constant( short_wave_daily, 24 * 3600 / 1000) # Wh/m2 * 3600 s/h * kJ/1000J (energy) over 24hrs long_wave_daily = we.make_daily_average(long_wave) long_wave_daily = we.multiply_constant(long_wave_daily, 24 * 3600 / 1000) temperature_daily = we.make_daily_average(temperature) Short_wave_list = we.strip_metadata(short_wave_daily) I_clear_sky_list = [ irradiance_clear_sky(utm_e, utm_n, d) for d in date_list ] Cloud_cover = clouds_from_short_wave(utm_e, utm_n, Short_wave_list, date_list) import matplotlib.pyplot as plt plt.plot(date_list, Short_wave_list) plt.plot(date_list, I_clear_sky_list) plt.plot(date_list, Cloud_cover) plt.ylim(0, 50000) plt.show()
def read_hydra_time_value(station, element, file_name, from_date=None, to_date=None, timeseries_type=0): """Reads a time/value file made in NVEs Start for accessing data in HydraII. :param station: :param element: :param file_name: :param from_date: {datetime} method returns [fromDate , toDate> :param to_date: {datetime} method returns [fromDate , toDate> :param timeseries_type: :return: """ print("getFildata.py -> read_hydra_time_value: Reading {0}".format( file_name)) if from_date is None: from_date = dt.date(0, 0, 0) if to_date is None: to_date = dt.datetime.now().date() inn_file = open(file_name) inn_data = inn_file.readlines() inn_file.close() separator = ' ' for i in range(len(inn_data)): inn_data[i] = inn_data[i].strip() # get rid of ' ' and '\n' and such inn_data[i] = inn_data[i].split( separator) # splits line into list of elements in the line weather_element_list = [] for d in inn_data: if d[0] == '': # blank line at end of file break value = float(d[1]) date = dt.datetime.strptime(d[0], '%Y%m%d/%H%M') if from_date.date() <= date.date() < to_date.date(): weather_element_list.append( we.WeatherElement(station, date, element, value)) if timeseries_type == -1: # do nothing weather_element_list = weather_element_list elif timeseries_type == 0: # make daily averages of hourly values weather_element_list = we.make_daily_average(weather_element_list) else: print('no valid time series type selected') weather_element_list = 'no valid time series type selected' return weather_element_list
def __test_clouds_from_short_wave(): date_list = [dt.date.today() - dt.timedelta(days=x) for x in range(0, 365)] date_list = [dt.datetime.combine(d, dt.datetime.min.time()) for d in date_list] date_list.reverse() # test Nordnesfjellet i Troms station_id = 91500 short_wave_id = 'QSI' long_wave_id = 'QLI' temperature_id = 'TA' timeseries_type = 2 utm_e = 711075 utm_n = 7727719 short_wave = gws.getMetData(station_id, short_wave_id, date_list[0], date_list[-1], timeseries_type) long_wave = gws.getMetData(station_id, long_wave_id, date_list[0], date_list[-1], timeseries_type) temperature = gws.getMetData(station_id, temperature_id, date_list[0], date_list[-1], timeseries_type) short_wave = we.fix_data_quick(short_wave) long_wave = we.fix_data_quick(long_wave) temperature_daily = we.fix_data_quick(temperature) short_wave_daily = we.make_daily_average(short_wave) short_wave_daily = we.multiply_constant(short_wave_daily, 24 * 3600 / 1000) # Wh/m2 * 3600 s/h * kJ/1000J (energy) over 24hrs long_wave_daily = we.make_daily_average(long_wave) long_wave_daily = we.multiply_constant(long_wave_daily, 24 * 3600 / 1000) temperature_daily = we.make_daily_average(temperature) Short_wave_list = we.strip_metadata(short_wave_daily) I_clear_sky_list = [irradiance_clear_sky(utm_e, utm_n, d) for d in date_list] Cloud_cover = clouds_from_short_wave(utm_e, utm_n, Short_wave_list, date_list) import matplotlib.pyplot as plt plt.plot(date_list, Short_wave_list) plt.plot(date_list, I_clear_sky_list) plt.plot(date_list, Cloud_cover) plt.ylim(0, 50000) plt.show()
def read_hydra_time_value(station, element, file_name, from_date=None, to_date=None, timeseries_type=0): """Reads a time/value file made in NVEs Start for accessing data in HydraII. :param station: :param element: :param file_name: :param from_date: {datetime} method returns [fromDate , toDate> :param to_date: {datetime} method returns [fromDate , toDate> :param timeseries_type: :return: """ print("getFildata.py -> read_hydra_time_value: Reading {0}".format(file_name)) if from_date is None: from_date = dt.date(0,0,0) if to_date is None: to_date = dt.datetime.now().date() inn_file = open(file_name) inn_data = inn_file.readlines() inn_file.close() separator = ' ' for i in range(len(inn_data)): inn_data[i] = inn_data[i].strip() # get rid of ' ' and '\n' and such inn_data[i] = inn_data[i].split(separator) # splits line into list of elements in the line weather_element_list = [] for d in inn_data: if d[0] == '': # blank line at end of file break value = float(d[1]) date = dt.datetime.strptime(d[0], '%Y%m%d/%H%M') if from_date.date() <= date.date() < to_date.date(): weather_element_list.append(we.WeatherElement(station, date, element, value)) if timeseries_type == -1: # do nothing weather_element_list = weather_element_list elif timeseries_type == 0: # make daily averages of hourly values weather_element_list = we.make_daily_average(weather_element_list) else: print('no valid time series type selected') weather_element_list = 'no valid time series type selected' return weather_element_list
def getgts(utm33x, utm33y, element_id, from_date, to_date, timeseries_type=0, patch_missing_values=True): """Retrieves data from the grid time series application (GTS) and maps it to a list of WeatherElements. Values in WeatherElements are given in meters, i.e in some cases they are converted from cm to m. Optionally the data is patched up if data is missing and daily averages from 00-24 are calculated. GTS data is given as 24hour avarages from 0600-0600. If timeseries_type=0 is requested, data is converted to daily average from 00-24hrs, time stamped at the end of the period (23:59:59). For wind data, fist data in the data set is from 1st march 2018. :param utm33x: [int] X coordinate in utm33N :param utm33y: [int] Y coordinate in utm33N :param element_id: [string] Element ID in seNorge. Ex: elementID = 'fsw' is 24hr new snow depth in [cm] :param from_date: [datetime or string YYYY-mm-dd] method returns data [fromDate, toDate] :param to_date: [datetime or string YYYY-mm-dd] method returns data [fromDate, toDate] :param timeseries_type [int] daily = 0 (default), no change = -1 :param patch_missing_values:[bool] Go through the list and check if som values are missing. If so, patch up. :param output: [list of WeatherElements] :return: http://h-web02.nve.no:8080/api/GridTimeSeries/gridtimeserie?theme=tm&startdate=2017-11-20&enddate=2017-11-22&x=109190&y=6817490 timeseries_type's: -1 Data returned as received from service 0 Data made to daily average from 00-24hrs See also: http://eklima.no/wsKlima/complete/cTimeserie_en.html element_id's used: fws: new snow last 24hrs in mm water equivalents sd: snow depth in cm tm: temperature average 24hrs sdfsw: new snow last 24hrs in cm windSpeed10m24h06: 10m wind speed over 24hrs ranging from 06-06 Wind is not tested yet: Vindretning døgn: http://h-web02:8080/api/GridTimeSeries/953709/7938592/2018-03-26/2018-04-17/windDirection10m24h06.json Vindretning 3 timer: http://h-web02:8080/api/GridTimeSeries/953709/7938592/2018-03-26/2018-04-17/windDirection10m3h.json Vind hastighet døgn: http://h-web02:8080/api/GridTimeSeries/953709/7938592/2018-03-26/2018-04-17/windSpeed10m24h06.json Vindhastighet 3 timer: http://h-web02:8080/api/GridTimeSeries/953709/7938592/2018-03-26/2018-04-17/windSpeed10m3h.json """ url = 'http://h-web02.nve.no:8080/api/GridTimeSeries/gridtimeserie?theme={0}&startdate={1}&enddate={2}&x={3}&y={4}'.format( element_id, from_date, to_date, utm33x, utm33y) responds = rq.get(url) full_data = responds.json() if 'Error' in full_data: ml.log_and_print("[error] getgts.py -> getgts: {0}".format(full_data)) return [] else: data = full_data['Data'] weather_element_list = [] date = dt.datetime.strptime(full_data['StartDate'], '%d.%m.%Y %H:%M:%S') # the assigned NoDataValue if one data element is missing. no_data_value = int(full_data['NoDataValue']) for d in data: value = float(d) if value == no_data_value: value = None weather_element = we.WeatherElement( 'UTM33 X{0} Y{1}'.format(utm33x, utm33y), date, element_id, value) weather_element.Metadata['DataSource'] = 'GTS' weather_element.Metadata['TimeResolution'] = full_data[ 'TimeResolution'] weather_element.Metadata['FullName'] = full_data['FullName'] weather_element.Metadata['WeatherDataAltitude'] = full_data[ 'Altitude'] weather_element_list.append(weather_element) date += dt.timedelta(minutes=full_data['TimeResolution']) if patch_missing_values: weather_element_list = we.patch_novalue_in_weather_element_list( weather_element_list) if element_id == 'fsw' or element_id == 'sd' or element_id == 'sdfsw': weather_element_list = we.meter_from_centimeter( weather_element_list) # convert for [cm] til [m] if timeseries_type == 0: weather_element_list = we.make_daily_average(weather_element_list) # fist element after doing daily average represents the day before the requested time period del weather_element_list[0] return weather_element_list
def getGriddata(UTM33X, UTM33Y, elementID, fromDate, toDate, timeseries_type=0, output='list'): """Method gets data from the chartserver api at NVE. Method called is ShowData.aspx. Future dates as well as past dates are returned. Future dates are generated from model grids from met.no Note that griddata is based on met data from 00 to 06 dayly values. Eg. precipitation on 17th of mai is found in data for 06:00 18th of mai. Method returns [fromDate,toDate> :param UTM33X: {int} X coordinate in utm33N :param UTM33Y: {int} Y coordinate in utm33N :param elementID: {string} Element ID in seNorge. Ex: elementID = 'fsw' is 24hr new snow depth in [cm] :param fromDate: {datetime or string YYYY-mm-dd} method returns data [fromDate, toDate] :param toDate: {datetime or string YYYY-mm-dd} method returns data [fromDate, toDate] :param timeseries_type {int} Works only on output='list' daily = 0 (default), no change = -1 :param output: {string} How to present the output. :return: {list} List of WeatherElement objects with 24h resolution. Timeseries types: None Data returned as received from service 0 Data made to daily average See also: http://eklima.no/wsKlima/complete/cTimeserie_en.html Output options: 'list': returns a list of WeatherElement objects. 'json': returns NULL but saves a .json file to the working folder. ElementID's used: fws: new snow last 24hrs in mm water equivalents sd: snow depth in cm tm: temperature avarage 24hrs sdfsw: new snow last 24hrs in cm Example URL for getting grid data http://h-web01.nve.no/chartserver/ShowData.aspx?req=getchart &ver=1.0 &vfmt=json &time=20141204T0000;20141212T0000 &chd=ds=hgts,da=29,id=260151;6671132;fsw """ if isinstance(fromDate, str): fromDate = dt.datetime.strptime(fromDate, '%Y-%m-%d') if isinstance(toDate, str): toDate = dt.datetime.strptime(toDate, '%Y-%m-%d') # include data in todate in the request toDate += dt.timedelta(days=1) url = '{0}&time={1};{2}&chd=ds=hgts,da=29,id={3};{4};{5}'.format( se.chart_server_basestring, fromDate.strftime('%Y%m%dT%H%M'), toDate.strftime('%Y%m%dT%H%M'), UTM33X, UTM33Y, elementID) if output == 'list': weatherElementList = _make_weather_element_list_from_url( url, 'UTM33 X{0} Y{1}'.format(UTM33X, UTM33Y), elementID, {'MethodName': 'Chartserver - getGriddata'}) # If to much data is requested, break it down to smaller portions. if weatherElementList == "Request less data.": time_delta = toDate - fromDate date_in_middle = (fromDate + time_delta/2).replace(hour=0, minute=0) weatherElementList = \ getGriddata(UTM33X, UTM33Y, elementID, fromDate, date_in_middle, timeseries_type=timeseries_type, output=output) \ + getGriddata(UTM33X, UTM33Y, elementID, date_in_middle, toDate, timeseries_type=timeseries_type, output=output) return weatherElementList else: if elementID == 'fsw' or elementID == 'sd' or elementID == 'sdfsw': weatherElementList = we.meter_from_centimeter(weatherElementList) # convert for [cm] til [m] if timeseries_type == -1: # do nothing weatherElementList = weatherElementList elif timeseries_type == 0: # make daily avaregs of hourly values weatherElementList = we.make_daily_average(weatherElementList) else: ml.log_and_print('getchartserverdata -> getGriddata: no valid timeseries type selected') weatherElementList = 'no valid timeseries type selected' return weatherElementList elif output == 'json': datareq = requests.get(url) filename = 'X{0}_Y{1}_{2}.{3}_{4}.json'.format( UTM33X, UTM33Y, elementID, fromDate.strftime('%Y%m%d'), toDate.strftime('%Y%m%d')) f = open(filename, 'w') f.write((datareq.text).encode('utf-8')) f.close() return else: ml.log_and_print('getchartserverdata -> getGriddata: No valid output requested.') return 'No valid output requested'
def getStationdata(stationID, elementID, fromDate, toDate, timeseries_type=0, output='list'): """Method gets data from the chartserver api at NVE. Method called is ShowData.aspx. The data returned from the api are 30min values but they may be recalculated to daily average in this method if timeseries_type=0. Method returns [fromDate,toDate>. Future dates are truncated in this method, but dataset may be complemented with the getYrdata in this class. :param stationID: {string} Station ID in hydra. Ex: stationID = '6.24.4' :param elementID: {string} Element ID in hydra. Ex: elementID = '17.1' :param fromDate: {datetime} method returns [fromDate ,toDate> :param toDate: {datetime} method returns [fromDate ,toDate> :param output: {string} How to present the output. :return: {list} List of WeatherElement objects. Timeseries types: None Data returned as received from service 0 Data made to daily average See also: http://eklima.no/wsKlima/complete/cTimeserie_en.html Output options: 'list': returns a list of WeatherElement objects. 'json': returns NULL but saves a .json file til the working folder. URL for getting stationdata from Hakkloa 6.24.4.17.1 http://h-web01.nve.no/chartserver/ShowData.aspx ?req=getchart &ver=1.0 &vfmt=json &time=20141204T0000;20141212T0000 &chd=ds=htsr,da=29,id=6.24.4.17.1 """ # if not datetime objects, make them so if isinstance(fromDate, str): fromDate = dt.datetime.strptime(fromDate, "%Y-%m-%d") if isinstance(toDate, str): toDate = dt.datetime.strptime(toDate, "%Y-%m-%d") url = "{0}&time={1};{2}&chd=ds=htsr,da=29,id={3}.{4}"\ .format(se.chart_server_basestring, fromDate.strftime('%Y%m%dT%H%M'), toDate.strftime('%Y%m%dT%H%M'), stationID, elementID) if output == 'list': weatherElementList = _make_weather_element_list_from_url(url, stationID, elementID, {'MethodName': 'Chartserver - getStationdata'}) # If to much data is requested, break it down to smaller portions. if weatherElementList == "Request less data.": time_delta = toDate - fromDate date_in_middle = (fromDate + time_delta/2).replace(hour=0, minute=0) weatherElementList = getStationdata(stationID, elementID, fromDate, date_in_middle, timeseries_type=timeseries_type, output=output) \ + getStationdata(stationID, elementID, date_in_middle, toDate, timeseries_type=timeseries_type, output=output) return weatherElementList else: if timeseries_type == -1: # do nothing weatherElementList = weatherElementList elif timeseries_type == 0: # make daily averages of hourly values weatherElementList = we.make_daily_average(weatherElementList) else: ml.log_and_print('getchartserverdata -> getYrdata: no valid timeseries type selected') weatherElementList = 'no valid timeseries type selected' return weatherElementList elif output == 'json': datareq = requests.get(url) filename = '{0}.{1}_{2}_{3}.json'\ .format(stationID, elementID, fromDate.strftime('%Y%m%d'), dt.date.today().strftime('%Y%m%d')) f = open(filename, 'w') f.write((datareq.text).encode('utf-8')) f.close() return else: ml.log_and_print('getchartserverdata -> getYrdata: No valid output requested.') return 'No valid output requested'
def getYrdata(stationID, elementID, fromDate, toDate, timeseries_type=0, output='list'): """ Gets data form yr.no though the chartserver api at NVE. Method called is ShowData.aspx. Does not return historical values. Seems only to return +48 hrs even though more is requested. :param stationID: {string} Station ID in hydra. Ex: stationID = '6.24.4' :param elementID: {string} Element ID in hydra. Ex: elementID = '17.1' :param fromDate: {datetime} method returns data including fromDate :param toDate: {datetime} method returns data including toDate :param output: {string} How to present the output. :return: List of WeatherElement objects with 24h resolution. Timeseries types: None Data returned as received from service 0 Data made to daily average See also: http://eklima.no/wsKlima/complete/cTimeserie_en.html Output options: 'list': returns a list of WeatherElement objects. 'json': returns NULL but saves a .json file til the working folder. URL for getting stationdata from Hakkloa 6.24.4.17.1 http://h-web01.nve.no/chartserver/ShowData.aspx ?req=getchart &ver=1.0 &vfmt=json &time=20141204T0000;20141212T0000 &chd=ds=htsry,id=hydx[6;24;4;17;1].6000 """ url = "{0}&time={1};{2}&chd=ds=htsry,id=hydx[{3};{4}].6000"\ .format(se.chart_server_basestring, fromDate.strftime('%Y%m%dT%H%M'), toDate.strftime('%Y%m%dT%H%M'), stationID.replace('.',';'), elementID.replace('.',';')) if output == 'list': weatherElementList = _make_weather_element_list_from_url(url, stationID, elementID, {'MethodName': 'Chartserver - getYrdata'}) # If to much data is requested, break it down to smaller portions. if weatherElementList == "Request less data.": time_delta = toDate - fromDate date_in_middle = (fromDate + time_delta/2).replace(hour=0, minute=0) weatherElementList = getYrdata(stationID, elementID, fromDate, date_in_middle, timeseries_type=timeseries_type, output=output) \ + getYrdata(stationID, elementID, date_in_middle, toDate, timeseries_type=timeseries_type, output=output) return weatherElementList else: if timeseries_type == -1: # do nothing weatherElementList = weatherElementList elif timeseries_type == 0: # make dailyavaregs of hourly values weatherElementList = we.make_daily_average(weatherElementList) else: ml.log_and_print('getchartserverdata -> getYrdata: no valid timeseries type selected') weatherElementList = 'no valid timeseries type selected' return weatherElementList elif output == 'json': datareq = requests.get(url) filename = '{0}.{1}_{2}_{3}.json'\ .format(stationID, elementID, dt.date.today().strftime('%Y%m%d'), toDate.strftime('%Y%m%d')) f = open(filename, 'w') f.write((datareq.text).encode('utf-8')) f.close() return else: ml.log_and_print('getchartserverdata -> getYrdata: No valid output requested.') return 'No valid output requested'
def getGriddata(UTM33X, UTM33Y, elementID, fromDate, toDate, timeseries_type=0, output='list'): """Method gets data from the chartserver api at NVE. Method called is ShowData.aspx. Future dates as well as past dates are returned. Future dates are generated from model grids from met.no Note that griddata is based on met data from 00 to 06 dayly values. Eg. precipitation on 17th of mai is found in data for 06:00 18th of mai. Method returns [fromDate,toDate> :param UTM33X: {int} X coordinate in utm33N :param UTM33Y: {int} Y coordinate in utm33N :param elementID: {string} Element ID in seNorge. Ex: elementID = 'fsw' is 24hr new snow depth in [cm] :param fromDate: {datetime or string YYYY-mm-dd} method returns data [fromDate, toDate] :param toDate: {datetime or string YYYY-mm-dd} method returns data [fromDate, toDate] :param timeseries_type {int} Works only on output='list' daily = 0 (default), no change = -1 :param output: {string} How to present the output. :return: {list} List of WeatherElement objects with 24h resolution. Timeseries types: None Data returned as received from service 0 Data made to daily average See also: http://eklima.no/wsKlima/complete/cTimeserie_en.html Output options: 'list': returns a list of WeatherElement objects. 'json': returns NULL but saves a .json file to the working folder. ElementID's used: fws: new snow last 24hrs in mm water equivalents sd: snow depth in cm tm: temperature avarage 24hrs sdfsw: new snow last 24hrs in cm Example URL for getting grid data http://h-web01.nve.no/chartserver/ShowData.aspx?req=getchart &ver=1.0 &vfmt=json &time=20141204T0000;20141212T0000 &chd=ds=hgts,da=29,id=260151;6671132;fsw """ if isinstance(fromDate, str): fromDate = dt.datetime.strptime(fromDate, '%Y-%m-%d') if isinstance(toDate, str): toDate = dt.datetime.strptime(toDate, '%Y-%m-%d') # include data in todate in the request toDate += dt.timedelta(days=1) url = '{0}&time={1};{2}&chd=ds=hgts,da=29,id={3};{4};{5}'.format( se.chart_server_basestring, fromDate.strftime('%Y%m%dT%H%M'), toDate.strftime('%Y%m%dT%H%M'), UTM33X, UTM33Y, elementID) if output == 'list': weatherElementList = _make_weather_element_list_from_url( url, 'UTM33 X{0} Y{1}'.format(UTM33X, UTM33Y), elementID, {'MethodName': 'Chartserver - getGriddata'}) # If to much data is requested, break it down to smaller portions. if weatherElementList == "Request less data.": time_delta = toDate - fromDate date_in_middle = (fromDate + time_delta / 2).replace(hour=0, minute=0) weatherElementList = \ getGriddata(UTM33X, UTM33Y, elementID, fromDate, date_in_middle, timeseries_type=timeseries_type, output=output) \ + getGriddata(UTM33X, UTM33Y, elementID, date_in_middle, toDate, timeseries_type=timeseries_type, output=output) return weatherElementList else: if elementID == 'fsw' or elementID == 'sd' or elementID == 'sdfsw': weatherElementList = we.meter_from_centimeter( weatherElementList) # convert for [cm] til [m] if timeseries_type == -1: # do nothing weatherElementList = weatherElementList elif timeseries_type == 0: # make daily avaregs of hourly values weatherElementList = we.make_daily_average(weatherElementList) else: ml.log_and_print( 'getchartserverdata -> getGriddata: no valid timeseries type selected' ) weatherElementList = 'no valid timeseries type selected' return weatherElementList elif output == 'json': datareq = requests.get(url) filename = 'X{0}_Y{1}_{2}.{3}_{4}.json'.format( UTM33X, UTM33Y, elementID, fromDate.strftime('%Y%m%d'), toDate.strftime('%Y%m%d')) f = open(filename, 'w') f.write((datareq.text).encode('utf-8')) f.close() return else: ml.log_and_print( 'getchartserverdata -> getGriddata: No valid output requested.') return 'No valid output requested'
def getStationdata(stationID, elementID, fromDate, toDate, timeseries_type=0, output='list'): """Method gets data from the chartserver api at NVE. Method called is ShowData.aspx. The data returned from the api are 30min values but they may be recalculated to daily average in this method if timeseries_type=0. Method returns [fromDate,toDate>. Future dates are truncated in this method, but dataset may be complemented with the getYrdata in this class. :param stationID: {string} Station ID in hydra. Ex: stationID = '6.24.4' :param elementID: {string} Element ID in hydra. Ex: elementID = '17.1' :param fromDate: {datetime} method returns [fromDate ,toDate> :param toDate: {datetime} method returns [fromDate ,toDate> :param output: {string} How to present the output. :return: {list} List of WeatherElement objects. Timeseries types: None Data returned as received from service 0 Data made to daily average See also: http://eklima.no/wsKlima/complete/cTimeserie_en.html Output options: 'list': returns a list of WeatherElement objects. 'json': returns NULL but saves a .json file til the working folder. URL for getting stationdata from Hakkloa 6.24.4.17.1 http://h-web01.nve.no/chartserver/ShowData.aspx ?req=getchart &ver=1.0 &vfmt=json &time=20141204T0000;20141212T0000 &chd=ds=htsr,da=29,id=6.24.4.17.1 """ # if not datetime objects, make them so if isinstance(fromDate, str): fromDate = dt.datetime.strptime(fromDate, "%Y-%m-%d") if isinstance(toDate, str): toDate = dt.datetime.strptime(toDate, "%Y-%m-%d") url = "{0}&time={1};{2}&chd=ds=htsr,da=29,id={3}.{4}"\ .format(se.chart_server_basestring, fromDate.strftime('%Y%m%dT%H%M'), toDate.strftime('%Y%m%dT%H%M'), stationID, elementID) if output == 'list': weatherElementList = _make_weather_element_list_from_url( url, stationID, elementID, {'MethodName': 'Chartserver - getStationdata'}) # If to much data is requested, break it down to smaller portions. if weatherElementList == "Request less data.": time_delta = toDate - fromDate date_in_middle = (fromDate + time_delta / 2).replace(hour=0, minute=0) weatherElementList = getStationdata(stationID, elementID, fromDate, date_in_middle, timeseries_type=timeseries_type, output=output) \ + getStationdata(stationID, elementID, date_in_middle, toDate, timeseries_type=timeseries_type, output=output) return weatherElementList else: if timeseries_type == -1: # do nothing weatherElementList = weatherElementList elif timeseries_type == 0: # make daily averages of hourly values weatherElementList = we.make_daily_average(weatherElementList) else: ml.log_and_print( 'getchartserverdata -> getYrdata: no valid timeseries type selected' ) weatherElementList = 'no valid timeseries type selected' return weatherElementList elif output == 'json': datareq = requests.get(url) filename = '{0}.{1}_{2}_{3}.json'\ .format(stationID, elementID, fromDate.strftime('%Y%m%d'), dt.date.today().strftime('%Y%m%d')) f = open(filename, 'w') f.write((datareq.text).encode('utf-8')) f.close() return else: ml.log_and_print( 'getchartserverdata -> getYrdata: No valid output requested.') return 'No valid output requested'
def getYrdata(stationID, elementID, fromDate, toDate, timeseries_type=0, output='list'): """ Gets data form yr.no though the chartserver api at NVE. Method called is ShowData.aspx. Does not return historical values. Seems only to return +48 hrs even though more is requested. :param stationID: {string} Station ID in hydra. Ex: stationID = '6.24.4' :param elementID: {string} Element ID in hydra. Ex: elementID = '17.1' :param fromDate: {datetime} method returns data including fromDate :param toDate: {datetime} method returns data including toDate :param output: {string} How to present the output. :return: List of WeatherElement objects with 24h resolution. Timeseries types: None Data returned as received from service 0 Data made to daily average See also: http://eklima.no/wsKlima/complete/cTimeserie_en.html Output options: 'list': returns a list of WeatherElement objects. 'json': returns NULL but saves a .json file til the working folder. URL for getting stationdata from Hakkloa 6.24.4.17.1 http://h-web01.nve.no/chartserver/ShowData.aspx ?req=getchart &ver=1.0 &vfmt=json &time=20141204T0000;20141212T0000 &chd=ds=htsry,id=hydx[6;24;4;17;1].6000 """ url = "{0}&time={1};{2}&chd=ds=htsry,id=hydx[{3};{4}].6000"\ .format(se.chart_server_basestring, fromDate.strftime('%Y%m%dT%H%M'), toDate.strftime('%Y%m%dT%H%M'), stationID.replace('.',';'), elementID.replace('.',';')) if output == 'list': weatherElementList = _make_weather_element_list_from_url( url, stationID, elementID, {'MethodName': 'Chartserver - getYrdata'}) # If to much data is requested, break it down to smaller portions. if weatherElementList == "Request less data.": time_delta = toDate - fromDate date_in_middle = (fromDate + time_delta / 2).replace(hour=0, minute=0) weatherElementList = getYrdata(stationID, elementID, fromDate, date_in_middle, timeseries_type=timeseries_type, output=output) \ + getYrdata(stationID, elementID, date_in_middle, toDate, timeseries_type=timeseries_type, output=output) return weatherElementList else: if timeseries_type == -1: # do nothing weatherElementList = weatherElementList elif timeseries_type == 0: # make dailyavaregs of hourly values weatherElementList = we.make_daily_average(weatherElementList) else: ml.log_and_print( 'getchartserverdata -> getYrdata: no valid timeseries type selected' ) weatherElementList = 'no valid timeseries type selected' return weatherElementList elif output == 'json': datareq = requests.get(url) filename = '{0}.{1}_{2}_{3}.json'\ .format(stationID, elementID, dt.date.today().strftime('%Y%m%d'), toDate.strftime('%Y%m%d')) f = open(filename, 'w') f.write((datareq.text).encode('utf-8')) f.close() return else: ml.log_and_print( 'getchartserverdata -> getYrdata: No valid output requested.') return 'No valid output requested'