Description
Pandas version checks
-
I have checked that this issue has not already been reported.
-
I have confirmed this bug exists on the latest version of pandas.
-
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 : fb754d7
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