code: def _process_date_conversion(
      data_dict,
      converter: Callable,
      parse_spec,
      index_col,
      index_names,
      columns,
      keep_date_col: bool = False,
      dtype_backend=lib.no_default,
  ):
      def _isindex(colspec):
          return (
              isinstance(index_col, list) and colspec in index_col
          ) or (
              isinstance(index_names, list) and colspec in index_names
          )
  
      new_cols = []
      new_data = {}
  
      orig_names = columns
      columns = list(columns)
  
      date_cols = set()
  
      if parse_spec is None or isinstance(parse_spec, bool):
          return data_dict, columns
  
      if isinstance(parse_spec, list):
          # list of column lists
          for colspec in parse_spec:
              if is_scalar(colspec) or isinstance(colspec, tuple):
                  if (
                      isinstance(colspec, int)
                      and colspec not in data_dict
                  ):
                      colspec = orig_names[colspec]
                  if _isindex(colspec):
                      continue
                  elif dtype_backend == "pyarrow":
                      import pyarrow as pa
  
                      dtype = data_dict[colspec].dtype
                      if isinstance(dtype, ArrowDtype) and (
                          pa.types.is_timestamp(dtype.pyarrow_dtype)
                          or pa.types.is_date(dtype.pyarrow_dtype)
                      ):
                          continue
  
                  # Pyarrow engine returns Series which we need to convert to
                  # numpy array before converter, its a no-op for other parsers
                  data_dict[colspec] = converter(
                      np.asarray(data_dict[colspec]), col=colspec
                  )
              else:
                  new_name, col, old_names = _try_convert_dates(
                      converter, colspec, data_dict, orig_names
                  )
                  if new_name in data_dict:
                      raise ValueError(
                          f"New date column already in dict {new_name}"
                      )
                  new_data[new_name] = col
                  new_cols.append(new_name)
                  date_cols.update(old_names)
  
      elif isinstance(parse_spec, dict):
          # dict of new name to column list
          for new_name, colspec in parse_spec.items():
              if new_name in data_dict:
                  raise ValueError(
                      f"Date column {new_name} already in dict"
                  )
  
              _, col, old_names = _try_convert_dates(
                  converter,
                  colspec,
                  data_dict,
                  orig_names,
                  target_name=new_name,
              )
  
              new_data[new_name] = col
  
              # If original column can be converted to date we keep the converted values
              # This can only happen if values are from single column
              if len(colspec) == 1:
                  new_data[colspec[0]] = col
  
              new_cols.append(new_name)
              date_cols.update(old_names)
  
      data_dict.update(new_data)
      new_cols.extend(columns)
  
      if not keep_date_col:
          for c in list(date_cols):
              data_dict.pop(c)
              new_cols.remove(c)
  
      return data_dict, new_cols
  
imports: from __future__ import annotations
  from collections import defaultdict
  from copy import copy
  import csv
  import datetime
  from enum import Enum
  import itertools
  from typing import TYPE_CHECKING, Any, Callable, Hashable, Iterable, List, Mapping, Sequence, Tuple, cast, final, overload
  import warnings
  import numpy
  from pandas._libs import lib, parsers
  import pandas._libs.ops
  from pandas._libs.parsers import STR_NA_VALUES
  from pandas._libs.tslibs import parsing
  from pandas._typing import ArrayLike, DtypeArg, DtypeObj, Scalar
  from pandas.compat._optional import import_optional_dependency
  from pandas.errors import ParserError, ParserWarning
  from pandas.util._exceptions import find_stack_level
  from pandas.core.dtypes.astype import astype_array
  from pandas.core.dtypes.common import ensure_object, is_bool_dtype, is_dict_like, is_dtype_equal, is_extension_array_dtype, is_float_dtype, is_integer, is_integer_dtype, is_list_like, is_object_dtype, is_scalar, is_string_dtype, pandas_dtype
  from pandas.core.dtypes.dtypes import CategoricalDtype, ExtensionDtype
  from pandas.core.dtypes.missing import isna
  from pandas import ArrowDtype, DatetimeIndex, StringDtype
  from pandas.core import algorithms
  from pandas.core.arrays import ArrowExtensionArray, BooleanArray, Categorical, ExtensionArray, FloatingArray, IntegerArray
  from pandas.core.arrays.boolean import BooleanDtype
  from pandas.core.indexes.api import Index, MultiIndex, default_index, ensure_index_from_sequences
  from pandas.core.series import Series
  from pandas.core.tools import datetimes
  from pandas.io.common import is_potential_multi_index
label_desc: Use image node_id 2 for calling a global function with example usage: _process_date_conversion(data_dict, converter, parse_spec, index_col, index_names, columns, keep_date_col, dtype_backend) and returns: data_dict,  new_cols, unknown, data_dict,  columns