Pandas version checks

  • [X] I have checked that this issue has not already been reported.

  • [X] I have confirmed this bug exists on the latest version of pandas.

  • [X] I have confirmed this bug exists on the main branch of pandas.

Reproducible Example

>>> import pandas as pd
>>> idx = pd.date_range(start='2018-04-24', end='2018-04-27', freq="1d")
>>> idx.freq  # index has a freq attribute
<Day>
>>> hasattr(idx[0], "freq")  # elements have no freq attribute
False
>>> f = lambda x: x + x.freq
>>> idx.map(f)  # doesn't fail, because it does't operate on the elements
DatetimeIndex(['2018-04-25', '2018-04-26', '2018-04-27', '2018-04-28'], dtype='datetime64[ns]', freq='D')

Issue Description

In general, the map method in Pandas works element-wise. However, for the datetimelike arrays (Datetimearray, TimedeltaArray, PeriodArray, DatetimeIndex, TimedeltaIndex, PeriodIndex), the .map functions tries to operate arraywise first and then only falls back to operating elementwise, if that fails.

Expected Behavior

I would expect consistent behavior across all of Pandas, i.e. map to always operates element-wise here, if it operates element-wise otherwise in Pandas.

If users want to operate array-wise, they should call the function on the array, i.e. in the above case do f(idx) instead of doing idx.map(f). Alternatively, we could add a .pipe method to Index, similarly how we have Series.pipe, so array-wise operations would be done like idx.pipe(f).

Installed Versions

INSTALLED VERSIONS ------------------ commit : fb754d71db2897b40dd603e880a15e028f64f750 python : 3.9.7.final.0 python-bits : 64 OS : Darwin OS-release : 22.3.0 Version : Darwin Kernel Version 22.3.0: Mon Jan 30 20:39:35 PST 2023; root:xnu-8792.81.3~2/RELEASE_ARM64_T8103 machine : arm64 processor : arm byteorder : little LC_ALL : None LANG : None LOCALE : None.UTF-8 pandas : 2.1.0.dev0+213.gfb754d71db.dirty numpy : 1.23.4 pytz : 2022.7 dateutil : 2.8.2 setuptools : 65.6.3 pip : 22.3.1 Cython : 0.29.33 pytest : 7.1.2 hypothesis : 6.37.0 sphinx : 5.0.2 blosc : 1.10.6 feather : None xlsxwriter : 3.0.3 lxml.etree : 4.9.1 html5lib : None pymysql : 1.0.2 psycopg2 : 2.9.5 jinja2 : 3.1.2 IPython : 8.9.0 pandas_datareader: None bs4 : 4.11.1 bottleneck : 1.3.5 brotli : fastparquet : 0.8.3 fsspec : 2022.11.0 gcsfs : 2022.11.0 matplotlib : 3.6.2 numba : 0.56.4 numexpr : 2.8.4 odfpy : None openpyxl : 3.0.10 pandas_gbq : None pyarrow : 9.0.0 pyreadstat : None pyxlsb : 1.0.10 s3fs : 2022.11.0 scipy : 1.9.1 snappy : None sqlalchemy : 1.4.43 tables : 3.7.0 tabulate : 0.9.0 xarray : None xlrd : 2.0.1 zstandard : 0.18.0 tzdata : None qtpy : 2.2.0 pyqt5 : None