code: def is_time_series(df: pd.DataFrame, date_col: str) -> bool:
      try:
          if df[date_col].isnull().any():
              return False
  
          df = pd.to_datetime(df[date_col]).to_frame()
  
          def rel(row):
              if not pd.isnull(row[date_col]) and not pd.isnull(
                  row["shifted_date"]
              ):
                  return relativedelta(
                      row[date_col], row["shifted_date"]
                  )
  
          value_counts = df[date_col].value_counts()
          # count with each date is constant
          if value_counts.nunique() == 1:
              # Univariate timeseries
              if value_counts.unique()[0] == 1:
                  df["shifted_date"] = df[date_col].shift(1)
                  # if dates cover full interval without gaps
                  return df.apply(rel, axis=1).nunique() == 1
  
              # Multivariate timeseries
              df_with_unique_dates = df.drop_duplicates().copy()
  
              df_with_unique_dates[
                  "shifted_date"
              ] = df_with_unique_dates[date_col].shift(1)
              # if unique dates cover full interval without gaps
              return (
                  df_with_unique_dates.apply(rel, axis=1).nunique() == 1
              )
  
          return False
      except Exception:
          return False
  
file_path: upgini/src/upgini/utils/datetime_utils.py
imports: import datetime
  import logging
  import re
  from typing import List, Optional
  import numpy
  import pandas
  from dateutil.relativedelta import relativedelta
  from pandas.api.types import is_numeric_dtype, is_period_dtype, is_string_dtype
  from upgini.errors import ValidationError
label_desc: Use image node_id 1 for calling a global function with example usage: is_time_series(df, date_col) and returns: False, False, unknown, False, relativedelta, unknown