class_docstr: An object used for binary ops where calendrical arithmetic
  is desired rather than absolute time arithmetic. Used to
  add or subtract a whole number of periods, such as several
  months or years, to a series or index of datetime dtype.
  Works similarly to pd.DateOffset, but stores the offset
  on the device (GPU).
  
  Parameters
  ----------
  n : int, default 1
      The number of time periods the offset represents.
  **kwds
      Temporal parameter that add to or replace the offset value.
      Parameters that **add** to the offset (like Timedelta):
      - months
  
  See Also
  --------
  pandas.DateOffset : The equivalent Pandas object that this
  object replicates
  
  Examples
  --------
  >>> from cudf import DateOffset
  >>> ts = cudf.Series([
  ...     "2000-01-01 00:00:00.012345678",
  ...     "2000-01-31 00:00:00.012345678",
  ...     "2000-02-29 00:00:00.012345678",
  ... ], dtype='datetime64[ns]')
  >>> ts + DateOffset(months=3)
  0   2000-04-01 00:00:00.012345678
  1   2000-04-30 00:00:00.012345678
  2   2000-05-29 00:00:00.012345678
  dtype: datetime64[ns]
  >>> ts - DateOffset(months=12)
  0   1999-01-01 00:00:00.012345678
  1   1999-01-31 00:00:00.012345678
  2   1999-02-28 00:00:00.012345678
  dtype: datetime64[ns]
  
  Notes
  -----
  Note that cuDF does not yet support DateOffset arguments
  that 'replace' units in the datetime data being operated on
  such as
      - year
      - month
      - week
      - day
      - hour
      - minute
      - second
      - microsecond
      - millisecond
      - nanosecond
  
  cuDF does not yet support rounding via a `normalize`
  keyword argument.
code: def _datetime_binop(
      self, datetime_col, op, reflect=False
  ) -> column.DatetimeColumn:
      if reflect and op == "__sub__":
          raise TypeError(
              f"Can not subtract a {type(datetime_col).__name__}"
              f" from a {type(self).__name__}"
          )
      if op not in {"__add__", "__sub__"}:
          raise TypeError(
              f"{op} not supported between {type(self).__name__}"
              f" and {type(datetime_col).__name__}"
          )
      if not self._is_no_op:
          if "months" in self._scalars:
              rhs = self._generate_months_column(len(datetime_col), op)
              datetime_col = libcudf.datetime.add_months(
                  datetime_col, rhs
              )
  
          for unit, value in self._scalars.items():
              if unit != "months":
                  value = -value if op == "__sub__" else value
                  datetime_col += cudf.core.column.as_column(
                      value, length=len(datetime_col)
                  )
  
      return datetime_col
  
imports: import math
  import re
  import warnings
  from typing import Sequence, Union
  import cupy
  import numpy
  import pandas
  import pandas.tseries.offsets
  from pandas.core.tools.datetimes import _unit_map
  from typing_extensions import Self
  import cudf
  from cudf import _lib
  from cudf._lib.strings.convert.convert_integers import is_integer
  from cudf.api.types import is_integer, is_scalar
  from cudf.core import column
  from cudf.core.index import as_index
label_desc: Use image node_id 5 for calling the DateOffset obj's underlying member method code with example usage: obj._datetime_binop(datetime_col, op, reflect) and returns: datetime_col