From: Jérôme Benoit Date: Thu, 30 Apr 2026 22:51:29 +0000 (+0200) Subject: refactor: extract ensure_datetime_series helper for date dtype workaround X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=ce843f94526ff07ef59807dd482223941800da99;p=freqai-strategies.git refactor: extract ensure_datetime_series helper for date dtype workaround Centralizes the int64 epoch-ms vs datetime detection logic into a shared helper. Handles both formats correctly: unit='ms' for int64, passthrough for existing datetime columns. Ref: https://github.com/freqtrade/freqtrade/issues/13107 --- diff --git a/ReforceXY/user_data/strategies/RLAgentStrategy.py b/ReforceXY/user_data/strategies/RLAgentStrategy.py index 815e5a1..d47f755 100644 --- a/ReforceXY/user_data/strategies/RLAgentStrategy.py +++ b/ReforceXY/user_data/strategies/RLAgentStrategy.py @@ -5,6 +5,7 @@ from typing import Any, Final, Literal, Optional import numpy as np import pandas as pd + # import talib.abstract as ta from freqtrade.persistence import Trade from freqtrade.strategy import IStrategy @@ -18,6 +19,12 @@ logger = logging.getLogger(__name__) ACTION_COLUMN: Final = "&-action" +def _ensure_datetime_series(series: pd.Series) -> pd.Series: + if pd.api.types.is_integer_dtype(series): + return pd.to_datetime(series, unit="ms", utc=True) + return pd.to_datetime(series, utc=True) + + class RLAgentStrategy(IStrategy): """ RLAgentStrategy @@ -55,7 +62,7 @@ class RLAgentStrategy(IStrategy): def feature_engineering_standard( self, dataframe: DataFrame, metadata: dict[str, Any], **kwargs ) -> DataFrame: - dates = pd.to_datetime(dataframe["date"], utc=True) + dates = _ensure_datetime_series(dataframe["date"]) dataframe["%-day_of_week"] = (dates.dt.dayofweek + 1) / 7 dataframe["%-hour_of_day"] = (dates.dt.hour + 1) / 25 diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index 04d125e..70747ab 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -51,6 +51,7 @@ from Utils import ( LABEL_COLUMNS, REGRESSORS, Regressor, + ensure_datetime_series, eval_set_and_weights, fit_regressor, format_dict, @@ -1376,12 +1377,9 @@ class QuickAdapterRegressorV3(BaseRegressionModel): training_filter=True, ) - start_date = pd.to_datetime( - unfiltered_df["date"].iloc[0], utc=True - ).strftime("%Y-%m-%d") - end_date = pd.to_datetime( - unfiltered_df["date"].iloc[-1], utc=True - ).strftime("%Y-%m-%d") + dates = ensure_datetime_series(unfiltered_df["date"]) + start_date = dates.iloc[0].strftime("%Y-%m-%d") + end_date = dates.iloc[-1].strftime("%Y-%m-%d") logger.info( f"-------------------- Training on data from {start_date} to " f"{end_date} --------------------" diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 2e5108d..b5d9ca8 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -16,7 +16,6 @@ from typing import ( ) import numpy as np -import pandas as pd import pandas_ta as pta import talib.abstract as ta from freqtrade.exchange import timeframe_to_minutes, timeframe_to_prev_date @@ -40,6 +39,7 @@ from Utils import ( apply_label_weighting, bottom_log_return, calculate_quantile, + ensure_datetime_series, ewo, format_dict, format_number, @@ -724,7 +724,7 @@ class QuickAdapterV3(IStrategy): def feature_engineering_standard( self, dataframe: DataFrame, metadata: dict[str, Any], **kwargs ) -> DataFrame: - dates = pd.to_datetime(dataframe["date"], utc=True) + dates = ensure_datetime_series(dataframe["date"]) dataframe["%-day_of_week"] = (dates.dt.dayofweek + 1) / 7 dataframe["%-hour_of_day"] = (dates.dt.hour + 1) / 25 diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 49e706d..54870ed 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -644,6 +644,12 @@ def get_label_prediction_config( ) +def ensure_datetime_series(series: pd.Series) -> pd.Series: + if pd.api.types.is_integer_dtype(series): + return pd.to_datetime(series, unit="ms", utc=True) + return pd.to_datetime(series, utc=True) + + def get_distance(p1: T, p2: T) -> T: return abs(p1 - p2)