Skip to content

Converting series of dates to Periods  #23438

Closed
@thequackdaddy

Description

@thequackdaddy

Code Sample, a copy-pastable example if possible

import pandas as pd

dates = pd.Series(pd.date_range('2014-01-01', '2017-01-01', freq='MS'))

# This fails...
pd.PeriodIndex(dates, freq='M')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-687a0b3d3b9a> in <module>
----> 1 pd.PeriodIndex(dates, freq='M')

~/git/pandas/pandas/core/indexes/period.py in __new__(cls, data, ordinal, freq, start, end, periods, tz, dtype, copy, name, **fields)
    221             else:
    222                 # don't pass copy here, since we copy later.
--> 223                 data = period_array(data=data, freq=freq)
    224 
    225         if copy:

~/git/pandas/pandas/core/arrays/period.py in period_array(data, freq, copy)
    920     """
    921     if is_datetime64_dtype(data):
--> 922         return PeriodArray._from_datetime64(data, freq)
    923     if isinstance(data, (ABCPeriodIndex, ABCSeries, PeriodArray)):
    924         return PeriodArray(data, freq)

~/git/pandas/pandas/core/arrays/period.py in _from_datetime64(cls, data, freq, tz)
    234         PeriodArray[freq]
    235         """
--> 236         data, freq = dt64arr_to_periodarr(data, freq, tz)
    237         return cls(data, freq=freq)
    238 

~/git/pandas/pandas/core/arrays/period.py in dt64arr_to_periodarr(data, freq, tz)
    983         elif freq != data.dt.freq:
    984             msg = DIFFERENT_FREQ_INDEX.format(freq.freqstr,
--> 985                                               data.dt.freq.freqstr)
    986             raise IncompatibleFrequency(msg)
    987         data = data._values

AttributeError: 'str' object has no attribute 'freqstr'

# As does this
dates.to_period('M')

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-944b687ce2da> in <module>
----> 1 dates.to_period('M')

~/git/pandas/pandas/core/series.py in to_period(self, freq, copy)
   4108             new_values = new_values.copy()
   4109 
-> 4110         new_index = self.index.to_period(freq=freq)
   4111         return self._constructor(new_values,
   4112                                  index=new_index).__finalize__(self)

AttributeError: 'RangeIndex' object has no attribute 'to_period'

Problem description

A pandas series of datetimes can't be easily converted to PeriodIndexes anymore. These work under older versions of pandas, but fail now on GitHub's master.

Expected Output

Just don't fail...

Output of pd.show_versions()

INSTALLED VERSIONS

commit: None
python: 3.6.6.final.0
python-bits: 64
OS: Darwin
OS-release: 18.0.0
machine: x86_64
processor: i386
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8

pandas: 0.24.0.dev0+850.g62a15fa40
pytest: 3.9.3
pip: 18.1
setuptools: 40.5.0
Cython: 3.0a0
numpy: 1.16.0.dev0+45718fd
scipy: 1.2.0.dev0+016a6ef
pyarrow: None
xarray: None
IPython: 7.1.1
sphinx: None
patsy: 0.5.1
dateutil: 2.7.5
pytz: 2018.6
blosc: None
bottleneck: None
tables: None
numexpr: None
feather: None
matplotlib: None
openpyxl: None
xlrd: None
xlwt: None
xlsxwriter: None
lxml: None
bs4: None
html5lib: None
sqlalchemy: None
pymysql: None
psycopg2: None
jinja2: 2.10
s3fs: None
fastparquet: None
pandas_gbq: None
pandas_datareader: None
gcsfs: None

Metadata

Metadata

Assignees

No one assigned

    Labels

    DatetimeDatetime data dtypePeriodPeriod data type

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions