diff --git a/CHANGES.rst b/CHANGES.rst index 28a31ca..eade65b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,4 +1,11 @@ +Release 1.4.1 +========================================= + +* **BUGFIX:** Fixed handling of ``numpy.datetime64`` values in ``DataPointCollection``. (#118) + +--------------------- + Release 1.4.0 ========================================= diff --git a/highcharts_core/__version__.py b/highcharts_core/__version__.py index bdbb22b..2783701 100644 --- a/highcharts_core/__version__.py +++ b/highcharts_core/__version__.py @@ -1 +1 @@ -__version__ = '1.4.0' \ No newline at end of file +__version__ = '1.4.1' \ No newline at end of file diff --git a/highcharts_core/options/series/data/collections.py b/highcharts_core/options/series/data/collections.py index 7865147..8ea506f 100644 --- a/highcharts_core/options/series/data/collections.py +++ b/highcharts_core/options/series/data/collections.py @@ -1,3 +1,4 @@ +import datetime from typing import Optional, List from collections import UserDict @@ -273,7 +274,18 @@ def __setattr__(self, name, value): try: setattr(data_points[index], name, value[index]) except validator_errors.CannotCoerceError: - if isinstance(value[index], str) and ',' in value[index]: + if 'datetime64' in value[index].__class__.__name__: + try: + coerced_value = value[index].astype(datetime.datetime) + IS_DATETIME = True + except (ValueError, TypeError): + IS_DATETIME = False + else: + IS_DATETIME = False + + if IS_DATETIME: + setattr(data_points[index], name, coerced_value) + elif isinstance(value[index], str) and ',' in value[index]: coerced_value = value[index].replace(',', '') setattr(data_points[index], name, coerced_value) elif checkers.is_numeric(value[index]) or ( diff --git a/requirements.dev.numpy.txt b/requirements.dev.numpy.txt index 3683cca..f0f92de 100644 --- a/requirements.dev.numpy.txt +++ b/requirements.dev.numpy.txt @@ -10,7 +10,6 @@ sphinx-toolbox==3.4.0 sphinx-tabs==3.4.1 tox==4.4.6 requests==2.31.0 -urllib3==1.26.9 validator-collection==1.5.0 anthropic==0.3.11 dill==0.3.7 diff --git a/requirements.dev.txt b/requirements.dev.txt index 0d3a71e..66a0dc8 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -10,7 +10,6 @@ sphinx-toolbox==3.4.0 sphinx-tabs==3.4.1 tox==4.4.6 requests==2.31.0 -urllib3==1.26.9 validator-collection==1.5.0 anthropic==0.3.11 dill==0.3.7 diff --git a/tests/options/series/test_area.py b/tests/options/series/test_area.py index dc16abf..0b69ea5 100644 --- a/tests/options/series/test_area.py +++ b/tests/options/series/test_area.py @@ -3116,6 +3116,31 @@ def test_LineSeries_from_csv(input_files, filename, property_map, kwargs, expect **kwargs) +def test_Bugfix118_LineSeries_from_pandas_with_datetime(): + import datetime as dt + try: + import pandas as pd + HAS_PANDAS = True + except ImportError: + HAS_PANDAS = False + + if HAS_PANDAS: + # Generate timestamps for the first 5 days of October 2023 + start_date = dt.datetime(2023, 10, 1) + end_date = dt.datetime(2023, 10, 5) + date_range = [start_date + dt.timedelta(days=i) for i in range(5)] + + # Create a list of values + values = [10, 20, 30, 40, 50] + + # Create a DataFrame + df = pd.DataFrame({'Timestamp': date_range, 'Value': values}) + my_series = cls5.from_pandas(df, property_map={"x": "Timestamp", "y": "Value"}) + + assert my_series is not None + assert isinstance(my_series, cls5) + + #### NEXT CLASS @pytest.mark.parametrize('kwargs, error', STANDARD_PARAMS)