Skip to content

Bug in EPW data collections #656

Description

@tg359

I'm using Pollination v1.70.1.0 (based on the number associated with the uninstaller), with ladybug-core 0.44.49 and have found a few bugs.

They're probably related, but the two I've stumbled across are:

When saving an EPW, I get this error:

from ladybug.epw import EPW

epw = EPW(r"C:\Users\...\source.epw")
epw.save(r"C:\Users\...\temp.epw")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[23], line 14
     13 epw = EPW(epw_file)
---> 14 epw.save(r"C:\Users\...\temp.epw")

File .\.venv\lib\site-packages\ladybug\epw.py:1931, in EPW.save(self, file_path)
   1925 def save(self, file_path):
   1926     """Write EPW object as a file.
   1927 
   1928     Args:
   1929         file_path: Text for the full path to where the file will be written.
   1930     """
-> 1931     file_data = self.to_file_string()
   1932     write_to_file(file_path, file_data, True)
   1933     return file_data

File .\.venv\lib\site-packages\ladybug\epw.py:1876, in EPW.to_file_string(self)
   1874 # load data if it's  not loaded convert to SI if it is in IP
   1875 if not self.is_data_loaded:
-> 1876     self._import_data()
   1877 originally_ip = False
   1878 if self.is_ip:

File .\.venv\lib\site-packages\ladybug\epw.py:379, in EPW._import_data(self, import_header_only)
    377     self._import_location(line)
    378     header_lines = [line] + [epwin.readline() for i in xrange(7)]
--> 379     self._import_header(header_lines)
    380 if import_header_only:
    381     return

File .\.venv\lib\site-packages\ladybug\epw.py:513, in EPW._import_header(self, header_lines)
    509     grnd_header = Header(temperature.GroundTemperature(), 'C',
    510                          AnalysisPeriod(), header_meta)
    511     grnd_vals = [float(x) for x in grnd_data[st_ind + 4: st_ind + 16]]
    512     self._monthly_ground_temps[float(grnd_data[st_ind])] = \
--> 513         MonthlyCollection(grnd_header, grnd_vals, list(xrange(12)))
    514     st_ind += 16
    516 # parse leap year, daylight savings and comments.

File .\.venv\lib\site-packages\ladybug\datacollection.py:1359, in __init__(self, header, values, datetimes)
   1357 self._datetimes = tuple(datetimes)
   1358 self.values = values
-> 1359 self._validated_a_period = False

TypeError: descriptor '_header' for 'BaseCollection' objects doesn't apply to a 'MonthlyCollection' object

And the other is when accessing data collections from an SQLiteResult:

from ladybug.sql import SQLiteResult

sql_obj = SQLiteResult(r"C:\Users\...\model\openstudio\run\eplusout.sql")
for outp in sql_obj.available_outputs:
    sql_obj.data_collections_by_output_name(outp)
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Cell In[1], line 5
      3 sql_obj = SQLiteResult(r"C:\Users\...\model\openstudio\run\eplusout.sql")
      4 for outp in sql_obj.available_outputs:
----> 5     sql_obj.data_collections_by_output_name(outp)

File c:\Users\...\.venv\lib\site-packages\ladybug\sql.py:371, in SQLiteResult.data_collections_by_output_name(self, output_name)
    369 if report_frequency == 'Hourly' or isinstance(report_frequency, int):
    370     for head, values in zip(headers, all_values):
--> 371         data_colls.append(HourlyContinuousCollection(head, values))
    372 elif report_frequency == 'Daily':
    373     for head, values in zip(headers, all_values):

File c:\Users\...\.venv\lib\site-packages\ladybug\datacollection.py:614, in HourlyContinuousCollection.__init__(self, header, values)
    609 assert header.analysis_period.end_hour == 23, \
    610     'analysis_period end hour of {} must be 23. Got {}'.format(
    611         self.__class__.__name__, header.analysis_period.end_hour)
    613 self._header = header
--> 614 self.values = values
    615 self._datetimes = None
    616 self._validated_a_period = True

File c:\Users\...\.venv\lib\site-packages\ladybug\_datacollectionbase.py:96, in BaseCollection.values(self, values)
     94 @values.setter
     95 def values(self, values):
---> 96     self._check_values(values)
     97     self._values = list(values)

File c:\Users\...\.venv\lib\site-packages\ladybug\datacollection.py:1024, in HourlyContinuousCollection._check_values(self, values)
   1020 """Check values whenever they come through the values setter."""
   1021 assert isinstance(values, Iterable) and not isinstance(
   1022     values, (str, dict, bytes, bytearray)), \
   1023     'values should be a list or tuple. Got {}'.format(type(values))
-> 1024 assert len(values) == len(self.header.analysis_period), 'Length of ' \
   1025     'values does not match that expected by the header analysis_period.'\
   1026     ' {} != {}'.format(len(values), len(self.header.analysis_period))

AssertionError: Length of values does not match that expected by the header analysis_period. 8760 != 8784

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions