Converting series of dates to Periods
See original GitHub issueCode 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
Issue Analytics
- State:
- Created 5 years ago
- Comments:10 (10 by maintainers)
Top GitHub Comments
Your
to_period
example doesn’t work for me in 0.23.4 (and don’t think should have ever worked?)I think
pd.PeriodIndex(dates, freq='M')
should work; note thatpd.PeriodIndex(list(dates), freq='M')
works for me on both 0.23.4 and master. I don’t see a reason why it shouldn’t work for aSeries
if it works for alist
.