BUG: infer_freq
throws exception on Series
of timezone-aware Timestamp
s · Issue #52456 · pandas-dev/pandas (original) (raw)
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
index = pd.date_range('2023-01-01', '2023-01-03', tz='America/Los_Angeles') series = index.to_series().reset_index(drop=True) object_series = series.astype(object)
for data in [index, series, object_series]: print('type:', type(data)) print('dtype:', data.dtype) try: freq = pd.infer_freq(data) print('success, freq is', freq) except Exception as e: print(str(e))
Issue Description
When given a Series
of timezone-aware Timestamp
s, infer_freq
throws an exception. However, if given a DatetimeIndex
of the exact same sequence of timezone-aware Timestamp
s, it works just fine. The problem comes from that DatetimeTZDtype
is not allowed when checking the dtype
of the Series
. Adding is_datetime64tz_dtype
to the dtype
check should fix this issue.
if not ( |
---|
is_datetime64_dtype(values) |
or is_timedelta64_dtype(values) |
or values.dtype == object |
): |
raise TypeError( |
"cannot infer freq from a non-convertible dtype " |
f"on a Series of {index.dtype}" |
) |
Note that, although the documentation says the input type must be DatetimeIndex
or TimedeltaIndex
, the type annotation does include Series
. The discrepancy among documentation, type annotation, and implementation (which accepts Series
and converts it into DatetimeIndex
when possible) should also be fixed.
def infer_freq( | ||
---|---|---|
index: DatetimeIndex | TimedeltaIndex | Series | DatetimeLikeArrayMixin, |
) -> str | None: |
Actual output of the example:
type: <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
dtype: datetime64[ns, America/Los_Angeles]
success, freq is D
type: <class 'pandas.core.series.Series'>
dtype: datetime64[ns, America/Los_Angeles]
cannot infer freq from a non-convertible dtype on a Series of datetime64[ns, America/Los_Angeles]
type: <class 'pandas.core.series.Series'>
dtype: object
success, freq is D
Expected Behavior
infer_freq
should accept Series
of timezone-aware timestamps, convert it into DateTimeIndex
, and proceed as usual.
Installed Versions
INSTALLED VERSIONS
------------------
commit : 478d340667831908b5b4bf09a2787a11a14560c9
python : 3.9.6.final.0
python-bits : 64
OS : Darwin
OS-release : 22.4.0
Version : Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000
machine : arm64
processor : arm
byteorder : little
LC_ALL : None
LANG : en_US.UTF-8
LOCALE : en_US.UTF-8
pandas : 2.0.0
numpy : 1.24.2
pytz : 2022.2.1
dateutil : 2.8.2
setuptools : 58.0.4
pip : 23.0
Cython : None
pytest : None
hypothesis : None
sphinx : None
blosc : None
feather : None
xlsxwriter : None
lxml.etree : 4.9.1
html5lib : None
pymysql : None
psycopg2 : None
jinja2 : 3.1.2
IPython : 8.5.0
pandas_datareader: None
bs4 : 4.11.1
bottleneck : None
brotli : None
fastparquet : None
fsspec : None
gcsfs : None
matplotlib : None
numba : None
numexpr : None
odfpy : None
openpyxl : None
pandas_gbq : None
pyarrow : None
pyreadstat : None
pyxlsb : None
s3fs : None
scipy : 1.10.0
snappy : None
sqlalchemy : None
tables : None
tabulate : None
xarray : None
xlrd : None
zstandard : None
tzdata : 2023.3
qtpy : 2.2.0
pyqt5 : None