From c914b8b0f8cd08a8844f3dec58da2da1f144fdc2 Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Thu, 1 Dec 2016 13:19:03 -0700 Subject: [PATCH 1/7] make iotools package and move tmy readers into it --- pvlib/__init__.py | 2 +- pvlib/iotools/__init__.py | 0 pvlib/iotools/api.py | 1 + pvlib/{ => iotools}/tmy.py | 0 pvlib/test/test_location.py | 4 ++-- pvlib/test/test_pvsystem.py | 14 +++++++------- pvlib/test/test_tmy.py | 14 +++++++------- 7 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 pvlib/iotools/__init__.py create mode 100644 pvlib/iotools/api.py rename pvlib/{ => iotools}/tmy.py (100%) diff --git a/pvlib/__init__.py b/pvlib/__init__.py index d8b0657822..ded685ff50 100644 --- a/pvlib/__init__.py +++ b/pvlib/__init__.py @@ -8,7 +8,7 @@ from pvlib import irradiance from pvlib import location from pvlib import solarposition -from pvlib import tmy +from pvlib.iotools.api import * from pvlib import tracking from pvlib import pvsystem from pvlib import spa diff --git a/pvlib/iotools/__init__.py b/pvlib/iotools/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pvlib/iotools/api.py b/pvlib/iotools/api.py new file mode 100644 index 0000000000..e81fb41390 --- /dev/null +++ b/pvlib/iotools/api.py @@ -0,0 +1 @@ +from pvlib.iotools.tmy import readtmy2, readtmy3 diff --git a/pvlib/tmy.py b/pvlib/iotools/tmy.py similarity index 100% rename from pvlib/tmy.py rename to pvlib/iotools/tmy.py diff --git a/pvlib/test/test_location.py b/pvlib/test/test_location.py index bc18583b83..b204663c89 100644 --- a/pvlib/test/test_location.py +++ b/pvlib/test/test_location.py @@ -226,7 +226,7 @@ def test_get_clearsky_valueerror(): def test_from_tmy_3(): from test_tmy import tmy3_testfile - from pvlib.tmy import readtmy3 + from pvlib import readtmy3 data, meta = readtmy3(tmy3_testfile) loc = Location.from_tmy(meta, data) assert loc.name is not None @@ -237,7 +237,7 @@ def test_from_tmy_3(): def test_from_tmy_2(): from test_tmy import tmy2_testfile - from pvlib.tmy import readtmy2 + from pvlib import readtmy2 data, meta = readtmy2(tmy2_testfile) loc = Location.from_tmy(meta, data) assert loc.name is not None diff --git a/pvlib/test/test_pvsystem.py b/pvlib/test/test_pvsystem.py index ba9372f127..6e0f2ba9ca 100644 --- a/pvlib/test/test_pvsystem.py +++ b/pvlib/test/test_pvsystem.py @@ -11,7 +11,6 @@ from pandas.util.testing import assert_series_equal, assert_frame_equal from numpy.testing import assert_allclose -from pvlib import tmy from pvlib import pvsystem from pvlib import clearsky from pvlib import irradiance @@ -44,15 +43,13 @@ 'State': 'CA', 'TZ': -8} -pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(tmy))) +pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(pvsystem))) -tmy3_testfile = os.path.join(pvlib_abspath, 'data', '703165TY.csv') -tmy2_testfile = os.path.join(pvlib_abspath, 'data', '12839.tm2') - -tmy3_data, tmy3_metadata = tmy.readtmy3(tmy3_testfile) -tmy2_data, tmy2_metadata = tmy.readtmy2(tmy2_testfile) def test_systemdef_tmy3(): + from pvlib.iotools import tmy + tmy3_testfile = os.path.join(pvlib_abspath, 'data', '703165TY.csv') + tmy3_data, tmy3_metadata = tmy.readtmy3(tmy3_testfile) expected = {'tz': -9.0, 'albedo': 0.1, 'altitude': 7.0, @@ -66,6 +63,9 @@ def test_systemdef_tmy3(): assert expected == pvsystem.systemdef(tmy3_metadata, 0, 0, .1, 5, 5) def test_systemdef_tmy2(): + from pvlib.iotools import tmy + tmy2_testfile = os.path.join(pvlib_abspath, 'data', '12839.tm2') + tmy2_data, tmy2_metadata = tmy.readtmy2(tmy2_testfile) expected = {'tz': -5, 'albedo': 0.1, 'altitude': 2.0, diff --git a/pvlib/test/test_tmy.py b/pvlib/test/test_tmy.py index fdb1c2771f..6b75026f3b 100644 --- a/pvlib/test/test_tmy.py +++ b/pvlib/test/test_tmy.py @@ -7,7 +7,7 @@ tmy3_testfile = os.path.join(test_dir, '../data/703165TY.csv') tmy2_testfile = os.path.join(test_dir, '../data/12839.tm2') -from pvlib import tmy +from pvlib.iotools import tmy def test_readtmy3(): @@ -17,25 +17,25 @@ def test_readtmy3(): def test_readtmy3_remote(): url = 'http://rredc.nrel.gov/solar/old_data/nsrdb/1991-2005/data/tmy3/703165TYA.CSV' tmy.readtmy3(url) - + def test_readtmy3_recolumn(): data, meta = tmy.readtmy3(tmy3_testfile) assert 'GHISource' in data.columns - + def test_readtmy3_norecolumn(): data, meta = tmy.readtmy3(tmy3_testfile, recolumn=False) assert 'GHI source' in data.columns - + def test_readtmy3_coerce_year(): coerce_year = 1987 data, meta = tmy.readtmy3(tmy3_testfile, coerce_year=coerce_year) assert (data.index.year == 1987).all() - + def test_readtmy3_no_coerce_year(): coerce_year = None data, meta = tmy.readtmy3(tmy3_testfile, coerce_year=coerce_year) assert 1997 and 1999 in data.index.year - + def test_readtmy2(): tmy.readtmy2(tmy2_testfile) - + From ffbbcd897445a0baff67b3ee0a87e0941c07ac93 Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Wed, 19 Sep 2018 17:14:22 -0700 Subject: [PATCH 2/7] fix api, add deprecations --- docs/sphinx/source/api.rst | 28 ++++++++++++++++++ docs/sphinx/source/clearsky.rst | 6 ++-- pvlib/__init__.py | 5 +++- pvlib/iotools/__init__.py | 1 + pvlib/iotools/api.py | 3 +- pvlib/iotools/tmy.py | 4 +-- pvlib/test/test_location.py | 8 +++--- pvlib/test/test_pvsystem.py | 10 ++++--- pvlib/test/test_tmy.py | 51 +++++++++++++++++++++++---------- pvlib/tmy.py | 13 +++++++++ 10 files changed, 100 insertions(+), 29 deletions(-) create mode 100644 pvlib/tmy.py diff --git a/docs/sphinx/source/api.rst b/docs/sphinx/source/api.rst index 0b9a8e20e4..1ea0844d71 100644 --- a/docs/sphinx/source/api.rst +++ b/docs/sphinx/source/api.rst @@ -294,9 +294,37 @@ Functions tracking.singleaxis +.. _iotools: + +IO Tools +======== + +Functions for reading and writing data from a variety of file formats +relevant to solar energy modeling. + +.. autosummary:: + :toctree: generated/ + + iotools.read_tmy2 + iotools.read_tmy3 + +A :py:class:`~pvlib.location.Location` object may be created from metadata +in some files. + +.. autosummary:: + :toctree: generated/ + + location.Location.from_tmy + + TMY === +.. warning:: + + The :py:mod:`pvlib.tmy` module is deprecated; it will be removed + in pvlib 0.7. Please see the :ref:`pvlib.iotools ` package. + Methods and functions for reading data from TMY files. .. autosummary:: diff --git a/docs/sphinx/source/clearsky.rst b/docs/sphinx/source/clearsky.rst index ee2e781d00..a9cdb10e50 100644 --- a/docs/sphinx/source/clearsky.rst +++ b/docs/sphinx/source/clearsky.rst @@ -40,10 +40,12 @@ We'll need these imports for the examples below. In [1]: import pvlib - In [1]: from pvlib import clearsky, atmosphere, tmy, solarposition + In [1]: from pvlib import clearsky, atmosphere, solarposition In [1]: from pvlib.location import Location + In [1]: from pvlib.iotools import read_tmy3 + .. _location: @@ -214,7 +216,7 @@ wavelengths [Bir80]_, and is implemented in In [1]: tmy_file = os.path.join(pvlib_data, '703165TY.csv') # TMY file - In [1]: tmy_data, tmy_header = tmy.readtmy3(tmy_file, coerce_year=1999) # read TMY data + In [1]: tmy_data, tmy_header = read_tmy3(tmy_file, coerce_year=1999) # read TMY data In [1]: tl_historic = clearsky.lookup_linke_turbidity(time=tmy_data.index, ...: latitude=tmy_header['latitude'], longitude=tmy_header['longitude']) diff --git a/pvlib/__init__.py b/pvlib/__init__.py index d46aa9d4b7..4a382d2675 100644 --- a/pvlib/__init__.py +++ b/pvlib/__init__.py @@ -6,9 +6,12 @@ from pvlib import irradiance from pvlib import location from pvlib import solarposition -from pvlib.iotools.api import * +from pvlib import iotools from pvlib import tracking from pvlib import pvsystem from pvlib import spa from pvlib import modelchain from pvlib import singlediode + +# for backwards compatibility for pvlib.tmy module +from pvlib import tmy \ No newline at end of file diff --git a/pvlib/iotools/__init__.py b/pvlib/iotools/__init__.py index e69de29bb2..5ba8addbef 100644 --- a/pvlib/iotools/__init__.py +++ b/pvlib/iotools/__init__.py @@ -0,0 +1 @@ +from pvlib.iotools.api import * \ No newline at end of file diff --git a/pvlib/iotools/api.py b/pvlib/iotools/api.py index e81fb41390..3b6075bb39 100644 --- a/pvlib/iotools/api.py +++ b/pvlib/iotools/api.py @@ -1 +1,2 @@ -from pvlib.iotools.tmy import readtmy2, readtmy3 +from pvlib.iotools.tmy import read_tmy2 +from pvlib.iotools.tmy import read_tmy3 \ No newline at end of file diff --git a/pvlib/iotools/tmy.py b/pvlib/iotools/tmy.py index 17cf316f28..68d4d28880 100644 --- a/pvlib/iotools/tmy.py +++ b/pvlib/iotools/tmy.py @@ -14,7 +14,7 @@ import pandas as pd -def readtmy3(filename=None, coerce_year=None, recolumn=True): +def read_tmy3(filename=None, coerce_year=None, recolumn=True): ''' Read a TMY3 file in to a pandas dataframe. @@ -267,7 +267,7 @@ def _recolumn(tmy3_dataframe): return tmy3_dataframe.rename(columns=mapping) -def readtmy2(filename): +def read_tmy2(filename): ''' Read a TMY2 file in to a DataFrame. diff --git a/pvlib/test/test_location.py b/pvlib/test/test_location.py index 62244d6a17..b37a6cecc0 100644 --- a/pvlib/test/test_location.py +++ b/pvlib/test/test_location.py @@ -232,8 +232,8 @@ def test_get_clearsky_valueerror(): def test_from_tmy_3(): from test_tmy import tmy3_testfile - from pvlib import readtmy3 - data, meta = readtmy3(tmy3_testfile) + from pvlib.iotools import read_tmy3 + data, meta = read_tmy3(tmy3_testfile) loc = Location.from_tmy(meta, data) assert loc.name is not None assert loc.altitude != 0 @@ -243,8 +243,8 @@ def test_from_tmy_3(): def test_from_tmy_2(): from test_tmy import tmy2_testfile - from pvlib import readtmy2 - data, meta = readtmy2(tmy2_testfile) + from pvlib.iotools import read_tmy2 + data, meta = read_tmy2(tmy2_testfile) loc = Location.from_tmy(meta, data) assert loc.name is not None assert loc.altitude != 0 diff --git a/pvlib/test/test_pvsystem.py b/pvlib/test/test_pvsystem.py index 9d65c70336..c0e89c5095 100644 --- a/pvlib/test/test_pvsystem.py +++ b/pvlib/test/test_pvsystem.py @@ -22,9 +22,10 @@ def test_systemdef_tmy3(): - pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(tmy))) + from pvlib.iotools import tmy + pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(pvsystem))) tmy3_testfile = os.path.join(pvlib_abspath, 'data', '703165TY.csv') - tmy3_data, tmy3_metadata = tmy.readtmy3(tmy3_testfile) + tmy3_data, tmy3_metadata = tmy.read_tmy3(tmy3_testfile) expected = {'tz': -9.0, 'albedo': 0.1, 'altitude': 7.0, @@ -39,9 +40,10 @@ def test_systemdef_tmy3(): def test_systemdef_tmy2(): - pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(tmy))) + from pvlib.iotools import tmy + pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(pvsystem))) tmy2_testfile = os.path.join(pvlib_abspath, 'data', '12839.tm2') - tmy2_data, tmy2_metadata = tmy.readtmy2(tmy2_testfile) + tmy2_data, tmy2_metadata = tmy.read_tmy2(tmy2_testfile) expected = {'tz': -5, 'albedo': 0.1, diff --git a/pvlib/test/test_tmy.py b/pvlib/test/test_tmy.py index 6b75026f3b..51aa39a162 100644 --- a/pvlib/test/test_tmy.py +++ b/pvlib/test/test_tmy.py @@ -2,40 +2,61 @@ import os from pandas.util.testing import network +import pytest + +from pvlib._deprecation import pvlibDeprecationWarning +from pvlib.iotools import tmy + +from conftest import fail_on_pvlib_version + test_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) tmy3_testfile = os.path.join(test_dir, '../data/703165TY.csv') tmy2_testfile = os.path.join(test_dir, '../data/12839.tm2') -from pvlib.iotools import tmy + +@fail_on_pvlib_version('0.7') +def test_deprecated_07(): + with pytest.warns(pvlibDeprecationWarning): + from pvlib.tmy import readtmy2 + readtmy2(tmy2_testfile) + with pytest.warns(pvlibDeprecationWarning): + from pvlib.tmy import readtmy3 + readtmy3(tmy3_testfile) -def test_readtmy3(): - tmy.readtmy3(tmy3_testfile) +def test_read_tmy3(): + tmy.read_tmy3(tmy3_testfile) + @network -def test_readtmy3_remote(): +def test_read_tmy3_remote(): url = 'http://rredc.nrel.gov/solar/old_data/nsrdb/1991-2005/data/tmy3/703165TYA.CSV' - tmy.readtmy3(url) + tmy.read_tmy3(url) + -def test_readtmy3_recolumn(): - data, meta = tmy.readtmy3(tmy3_testfile) +def test_read_tmy3_recolumn(): + data, meta = tmy.read_tmy3(tmy3_testfile) assert 'GHISource' in data.columns -def test_readtmy3_norecolumn(): - data, meta = tmy.readtmy3(tmy3_testfile, recolumn=False) + +def test_read_tmy3_norecolumn(): + data, meta = tmy.read_tmy3(tmy3_testfile, recolumn=False) assert 'GHI source' in data.columns -def test_readtmy3_coerce_year(): + +def test_read_tmy3_coerce_year(): coerce_year = 1987 - data, meta = tmy.readtmy3(tmy3_testfile, coerce_year=coerce_year) + data, meta = tmy.read_tmy3(tmy3_testfile, coerce_year=coerce_year) assert (data.index.year == 1987).all() -def test_readtmy3_no_coerce_year(): + +def test_read_tmy3_no_coerce_year(): coerce_year = None - data, meta = tmy.readtmy3(tmy3_testfile, coerce_year=coerce_year) + data, meta = tmy.read_tmy3(tmy3_testfile, coerce_year=coerce_year) assert 1997 and 1999 in data.index.year -def test_readtmy2(): - tmy.readtmy2(tmy2_testfile) + +def test_read_tmy2(): + tmy.read_tmy2(tmy2_testfile) diff --git a/pvlib/tmy.py b/pvlib/tmy.py new file mode 100644 index 0000000000..f7236c10b7 --- /dev/null +++ b/pvlib/tmy.py @@ -0,0 +1,13 @@ +""" +Deprecated version of pvlib.iotools.tmy +""" + +from pvlib.iotools import read_tmy2, read_tmy3 + +from pvlib._deprecation import deprecated + +readtmy2 = deprecated('0.6.1', alternative='iotools.read_tmy2', + name='readtmy2', removal='0.7')(read_tmy2) + +readtmy3 = deprecated('0.6.1', alternative='iotools.read_tmy2', + name='readtmy3', removal='0.7')(read_tmy3) \ No newline at end of file From 0e2e0d78f701e2ecf15af99993053ad3208d527a Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Wed, 19 Sep 2018 18:09:04 -0700 Subject: [PATCH 3/7] whitespace at end of file --- pvlib/iotools/api.py | 2 +- pvlib/test/test_tmy.py | 1 - pvlib/tmy.py | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pvlib/iotools/api.py b/pvlib/iotools/api.py index 3b6075bb39..3bf9a7638a 100644 --- a/pvlib/iotools/api.py +++ b/pvlib/iotools/api.py @@ -1,2 +1,2 @@ from pvlib.iotools.tmy import read_tmy2 -from pvlib.iotools.tmy import read_tmy3 \ No newline at end of file +from pvlib.iotools.tmy import read_tmy3 diff --git a/pvlib/test/test_tmy.py b/pvlib/test/test_tmy.py index 51aa39a162..5df92450bf 100644 --- a/pvlib/test/test_tmy.py +++ b/pvlib/test/test_tmy.py @@ -59,4 +59,3 @@ def test_read_tmy3_no_coerce_year(): def test_read_tmy2(): tmy.read_tmy2(tmy2_testfile) - diff --git a/pvlib/tmy.py b/pvlib/tmy.py index f7236c10b7..a9ea8164f9 100644 --- a/pvlib/tmy.py +++ b/pvlib/tmy.py @@ -10,4 +10,4 @@ name='readtmy2', removal='0.7')(read_tmy2) readtmy3 = deprecated('0.6.1', alternative='iotools.read_tmy2', - name='readtmy3', removal='0.7')(read_tmy3) \ No newline at end of file + name='readtmy3', removal='0.7')(read_tmy3) From 378697c577c5363f8a1bf16bfeed450833f91e70 Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Fri, 21 Sep 2018 15:46:12 -0700 Subject: [PATCH 4/7] update whatsnew --- docs/sphinx/source/whatsnew/v0.6.1.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/sphinx/source/whatsnew/v0.6.1.rst b/docs/sphinx/source/whatsnew/v0.6.1.rst index 37f8ee312a..f8e76e242d 100644 --- a/docs/sphinx/source/whatsnew/v0.6.1.rst +++ b/docs/sphinx/source/whatsnew/v0.6.1.rst @@ -12,6 +12,10 @@ date will require Python 3. (:issue:`501`) API Changes ~~~~~~~~~~~ +* Created the ``pvlib.iotools`` subpackage. (:issue:`29`, :issue:`261`) +* Deprecated ``tmy``, ``tmy.readtmy2`` and ``tmy.readtmy3``; + they will be removed in v0.7. Use the new :py:func:`pvlib.iotools.read_tmy2` + and :py:func:`pvlib.iotools.read_tmy3` instead. (:issue:`261`) Enhancements From add28eb806c25894443374ef91269d70799e5a85 Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Sat, 22 Sep 2018 14:41:30 -0700 Subject: [PATCH 5/7] define api in init instead of api.py --- pvlib/iotools/__init__.py | 3 ++- pvlib/iotools/api.py | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 pvlib/iotools/api.py diff --git a/pvlib/iotools/__init__.py b/pvlib/iotools/__init__.py index 5ba8addbef..e68be0fe1b 100644 --- a/pvlib/iotools/__init__.py +++ b/pvlib/iotools/__init__.py @@ -1 +1,2 @@ -from pvlib.iotools.api import * \ No newline at end of file +from pvlib.iotools.tmy import read_tmy2 # noqa: F401 +from pvlib.iotools.tmy import read_tmy3 # noqa: F401 diff --git a/pvlib/iotools/api.py b/pvlib/iotools/api.py deleted file mode 100644 index 3bf9a7638a..0000000000 --- a/pvlib/iotools/api.py +++ /dev/null @@ -1,2 +0,0 @@ -from pvlib.iotools.tmy import read_tmy2 -from pvlib.iotools.tmy import read_tmy3 From 9356c1fa371a574b975e00ee7bc32af4602cbee7 Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Sat, 22 Sep 2018 15:12:45 -0700 Subject: [PATCH 6/7] fix a few style errors --- pvlib/iotools/tmy.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/pvlib/iotools/tmy.py b/pvlib/iotools/tmy.py index 68d4d28880..e4ee8dd39c 100644 --- a/pvlib/iotools/tmy.py +++ b/pvlib/iotools/tmy.py @@ -2,15 +2,17 @@ Import functions for TMY2 and TMY3 data files. """ -import re import datetime -import dateutil import io +import re + try: + # python 2 compatibility from urllib2 import urlopen, Request except ImportError: from urllib.request import urlopen, Request +import dateutil import pandas as pd @@ -72,7 +74,7 @@ def read_tmy3(filename=None, coerce_year=None, recolumn=True): ============================= ====================================================================================================================================================== TMYData field description ============================= ====================================================================================================================================================== - TMYData.Index A pandas datetime index. NOTE, the index is currently timezone unaware, and times are set to local standard time (daylight savings is not indcluded) + TMYData.Index A pandas datetime index. NOTE, the index is currently timezone unaware, and times are set to local standard time (daylight savings is not included) TMYData.ETR Extraterrestrial horizontal radiation recv'd during 60 minutes prior to timestamp, Wh/m^2 TMYData.ETRN Extraterrestrial normal radiation recv'd during 60 minutes prior to timestamp, Wh/m^2 TMYData.GHI Direct and diffuse horizontal radiation recv'd during 60 minutes prior to timestamp, Wh/m^2 @@ -165,10 +167,10 @@ def read_tmy3(filename=None, coerce_year=None, recolumn=True): head = ['USAF', 'Name', 'State', 'TZ', 'latitude', 'longitude', 'altitude'] if filename.startswith('http'): - request = Request(filename, headers={'User-Agent': + request = Request(filename, headers={'User-Agent': ( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) ' 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 ' - 'Safari/537.36'}) + 'Safari/537.36')}) response = urlopen(request) csvdata = io.StringIO(response.read().decode(errors='ignore')) else: @@ -240,7 +242,8 @@ def _recolumn(tmy3_dataframe): ------- Recolumned DataFrame. """ - raw_columns = 'ETR (W/m^2),ETRN (W/m^2),GHI (W/m^2),GHI source,GHI uncert (%),DNI (W/m^2),DNI source,DNI uncert (%),DHI (W/m^2),DHI source,DHI uncert (%),GH illum (lx),GH illum source,Global illum uncert (%),DN illum (lx),DN illum source,DN illum uncert (%),DH illum (lx),DH illum source,DH illum uncert (%),Zenith lum (cd/m^2),Zenith lum source,Zenith lum uncert (%),TotCld (tenths),TotCld source,TotCld uncert (code),OpqCld (tenths),OpqCld source,OpqCld uncert (code),Dry-bulb (C),Dry-bulb source,Dry-bulb uncert (code),Dew-point (C),Dew-point source,Dew-point uncert (code),RHum (%),RHum source,RHum uncert (code),Pressure (mbar),Pressure source,Pressure uncert (code),Wdir (degrees),Wdir source,Wdir uncert (code),Wspd (m/s),Wspd source,Wspd uncert (code),Hvis (m),Hvis source,Hvis uncert (code),CeilHgt (m),CeilHgt source,CeilHgt uncert (code),Pwat (cm),Pwat source,Pwat uncert (code),AOD (unitless),AOD source,AOD uncert (code),Alb (unitless),Alb source,Alb uncert (code),Lprecip depth (mm),Lprecip quantity (hr),Lprecip source,Lprecip uncert (code),PresWth (METAR code),PresWth source,PresWth uncert (code)' + # paste in the header as one long line + raw_columns = 'ETR (W/m^2),ETRN (W/m^2),GHI (W/m^2),GHI source,GHI uncert (%),DNI (W/m^2),DNI source,DNI uncert (%),DHI (W/m^2),DHI source,DHI uncert (%),GH illum (lx),GH illum source,Global illum uncert (%),DN illum (lx),DN illum source,DN illum uncert (%),DH illum (lx),DH illum source,DH illum uncert (%),Zenith lum (cd/m^2),Zenith lum source,Zenith lum uncert (%),TotCld (tenths),TotCld source,TotCld uncert (code),OpqCld (tenths),OpqCld source,OpqCld uncert (code),Dry-bulb (C),Dry-bulb source,Dry-bulb uncert (code),Dew-point (C),Dew-point source,Dew-point uncert (code),RHum (%),RHum source,RHum uncert (code),Pressure (mbar),Pressure source,Pressure uncert (code),Wdir (degrees),Wdir source,Wdir uncert (code),Wspd (m/s),Wspd source,Wspd uncert (code),Hvis (m),Hvis source,Hvis uncert (code),CeilHgt (m),CeilHgt source,CeilHgt uncert (code),Pwat (cm),Pwat source,Pwat uncert (code),AOD (unitless),AOD source,AOD uncert (code),Alb (unitless),Alb source,Alb uncert (code),Lprecip depth (mm),Lprecip quantity (hr),Lprecip source,Lprecip uncert (code),PresWth (METAR code),PresWth source,PresWth uncert (code)' # noqa: E501 new_columns = [ 'ETR', 'ETRN', 'GHI', 'GHISource', 'GHIUncertainty', @@ -407,8 +410,9 @@ def read_tmy2(filename): 'on this system. Try installing X-Quartz and ' 'reloading') - string = '%2d%2d%2d%2d%4d%4d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%2d%1s%1d%2d%1s%1d%4d%1s%1d%4d%1s%1d%3d%1s%1d%4d%1s%1d%3d%1s%1d%3d%1s%1d%4d%1s%1d%5d%1s%1d%10d%3d%1s%1d%3d%1s%1d%3d%1s%1d%2d%1s%1d' - columns = 'year,month,day,hour,ETR,ETRN,GHI,GHISource,GHIUncertainty,DNI,DNISource,DNIUncertainty,DHI,DHISource,DHIUncertainty,GHillum,GHillumSource,GHillumUncertainty,DNillum,DNillumSource,DNillumUncertainty,DHillum,DHillumSource,DHillumUncertainty,Zenithlum,ZenithlumSource,ZenithlumUncertainty,TotCld,TotCldSource,TotCldUnertainty,OpqCld,OpqCldSource,OpqCldUncertainty,DryBulb,DryBulbSource,DryBulbUncertainty,DewPoint,DewPointSource,DewPointUncertainty,RHum,RHumSource,RHumUncertainty,Pressure,PressureSource,PressureUncertainty,Wdir,WdirSource,WdirUncertainty,Wspd,WspdSource,WspdUncertainty,Hvis,HvisSource,HvisUncertainty,CeilHgt,CeilHgtSource,CeilHgtUncertainty,PresentWeather,Pwat,PwatSource,PwatUncertainty,AOD,AODSource,AODUncertainty,SnowDepth,SnowDepthSource,SnowDepthUncertainty,LastSnowfall,LastSnowfallSource,LastSnowfallUncertaint' + # paste in the column info as one long line + string = '%2d%2d%2d%2d%4d%4d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%2d%1s%1d%2d%1s%1d%4d%1s%1d%4d%1s%1d%3d%1s%1d%4d%1s%1d%3d%1s%1d%3d%1s%1d%4d%1s%1d%5d%1s%1d%10d%3d%1s%1d%3d%1s%1d%3d%1s%1d%2d%1s%1d' # noqa: E501 + columns = 'year,month,day,hour,ETR,ETRN,GHI,GHISource,GHIUncertainty,DNI,DNISource,DNIUncertainty,DHI,DHISource,DHIUncertainty,GHillum,GHillumSource,GHillumUncertainty,DNillum,DNillumSource,DNillumUncertainty,DHillum,DHillumSource,DHillumUncertainty,Zenithlum,ZenithlumSource,ZenithlumUncertainty,TotCld,TotCldSource,TotCldUnertainty,OpqCld,OpqCldSource,OpqCldUncertainty,DryBulb,DryBulbSource,DryBulbUncertainty,DewPoint,DewPointSource,DewPointUncertainty,RHum,RHumSource,RHumUncertainty,Pressure,PressureSource,PressureUncertainty,Wdir,WdirSource,WdirUncertainty,Wspd,WspdSource,WspdUncertainty,Hvis,HvisSource,HvisUncertainty,CeilHgt,CeilHgtSource,CeilHgtUncertainty,PresentWeather,Pwat,PwatSource,PwatUncertainty,AOD,AODSource,AODUncertainty,SnowDepth,SnowDepthSource,SnowDepthUncertainty,LastSnowfall,LastSnowfallSource,LastSnowfallUncertaint' # noqa: E501 hdr_columns = 'WBAN,City,State,TZ,latitude,longitude,altitude' tmy2, tmy2_meta = _read_tmy2(string, columns, hdr_columns, filename) @@ -481,15 +485,15 @@ def _read_tmy2(string, columns, hdr_columns, fname): if marker[-1] == 'd': try: val = float(val) - except: - raise Exception('WARNING: In {} Read value is not an ' - 'integer " {} " '.format(fname, val)) + except ValueError: + raise ValueError('WARNING: In {} Read value is not an ' + 'integer " {} " '.format(fname, val)) elif marker[-1] == 's': try: val = str(val) - except: - raise Exception('WARNING: In {} Read value is not a ' - 'string " {} " '.format(fname, val)) + except ValueError: + raise ValueError('WARNING: In {} Read value is not a ' + 'string " {} " '.format(fname, val)) else: raise Exception('WARNING: In {} Improper column DataFrame ' '" %{} " '.format(__name__, marker)) From 99b6bdf9dadcf2034d31544cdd838c048482f905 Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Sat, 22 Sep 2018 15:23:27 -0700 Subject: [PATCH 7/7] more style fixes --- pvlib/__init__.py | 2 +- pvlib/iotools/tmy.py | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/pvlib/__init__.py b/pvlib/__init__.py index 4a382d2675..238d481615 100644 --- a/pvlib/__init__.py +++ b/pvlib/__init__.py @@ -14,4 +14,4 @@ from pvlib import singlediode # for backwards compatibility for pvlib.tmy module -from pvlib import tmy \ No newline at end of file +from pvlib import tmy diff --git a/pvlib/iotools/tmy.py b/pvlib/iotools/tmy.py index e4ee8dd39c..9c5ba9e9ca 100644 --- a/pvlib/iotools/tmy.py +++ b/pvlib/iotools/tmy.py @@ -204,7 +204,7 @@ def read_tmy3(filename=None, coerce_year=None, recolumn=True): if recolumn: data = _recolumn(data) # rename to standard column names - data = data.tz_localize(int(meta['TZ']*3600)) + data = data.tz_localize(int(meta['TZ'] * 3600)) return data, meta @@ -475,11 +475,12 @@ def _read_tmy2(string, columns, hdr_columns, fname): # Read the next increment from the marker list increment = int(re.findall('\d+', marker)[0]) + next_cursor = cursor + increment # Extract the value from the line in the file - val = (line[cursor:cursor+increment]) + val = (line[cursor:next_cursor]) # increment the cursor by the length of the read value - cursor = cursor+increment + cursor = next_cursor # Determine the datatype from the marker string if marker[-1] == 'd': @@ -502,7 +503,7 @@ def _read_tmy2(string, columns, hdr_columns, fname): if fline == 0: axes = [part] - year = part[0]+1900 + year = part[0] + 1900 fline = 1 else: axes.append(part) @@ -511,10 +512,10 @@ def _read_tmy2(string, columns, hdr_columns, fname): date.append(datetime.datetime(year=int(year), month=int(part[1]), day=int(part[2]), - hour=int(part[3])-1)) + hour=(int(part[3]) - 1))) data = pd.DataFrame( axes, index=date, - columns=columns.split(',')).tz_localize(int(meta['TZ']*3600)) + columns=columns.split(',')).tz_localize(int(meta['TZ'] * 3600)) return data, meta