Неверная частота: SM-15 в pandas.Series.dt.to_period - PullRequest
0 голосов
/ 23 декабря 2019

Я пытаюсь и не могу привести даты к полугодовым периодам. Я не знаю, является ли это ошибкой панд или нет, поэтому я публикую здесь, используя формат проблемы.

Пример кода

import pandas as pd

# Create column, cast to datetime
a = ['2018-04-01', '2018-04-06', '2018-04-10', '2018-04-20', '2018-04-25']
df = pd.DataFrame(a, columns=['a'])
df['a'] = pd.to_datetime(df['a'])

# Attempt to cast to half-month periods
df['a'].dt.to_period('SM')

Создает эту трассировку:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
pandas/_libs/tslibs/frequencies.pyx in pandas._libs.tslibs.frequencies._period_str_to_code()

KeyError: 'SM-15'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-128-b954dd6bd134> in <module>
----> 1 df['a'].dt.to_period('SM')

~/local/anaconda3/envs/create-database/lib/python3.7/site-packages/pandas/core/accessor.py in f(self, *args, **kwargs)
     91         def _create_delegator_method(name):
     92             def f(self, *args, **kwargs):
---> 93                 return self._delegate_method(name, *args, **kwargs)
     94 
     95             f.__name__ = name

~/local/anaconda3/envs/create-database/lib/python3.7/site-packages/pandas/core/indexes/accessors.py in _delegate_method(self, name, *args, **kwargs)
    107 
    108         method = getattr(values, name)
--> 109         result = method(*args, **kwargs)
    110 
    111         if not is_list_like(result):

~/local/anaconda3/envs/create-database/lib/python3.7/site-packages/pandas/core/accessor.py in f(self, *args, **kwargs)
     91         def _create_delegator_method(name):
     92             def f(self, *args, **kwargs):
---> 93                 return self._delegate_method(name, *args, **kwargs)
     94 
     95             f.__name__ = name

~/local/anaconda3/envs/create-database/lib/python3.7/site-packages/pandas/core/indexes/datetimelike.py in _delegate_method(self, name, *args, **kwargs)
    811 
    812     def _delegate_method(self, name, *args, **kwargs):
--> 813         result = operator.methodcaller(name, *args, **kwargs)(self._data)
    814         if name not in self._raw_methods:
    815             result = Index(result, name=self.name)

~/local/anaconda3/envs/create-database/lib/python3.7/site-packages/pandas/core/arrays/datetimes.py in to_period(self, freq)
   1280             freq = get_period_alias(freq)
   1281 
-> 1282         return PeriodArray._from_datetime64(self._data, freq, tz=self.tz)
   1283 
   1284     def to_perioddelta(self, freq):

~/local/anaconda3/envs/create-database/lib/python3.7/site-packages/pandas/core/arrays/period.py in _from_datetime64(cls, data, freq, tz)
    273         PeriodArray[freq]
    274         """
--> 275         data, freq = dt64arr_to_periodarr(data, freq, tz)
    276         return cls(data, freq=freq)
    277 

~/local/anaconda3/envs/create-database/lib/python3.7/site-packages/pandas/core/arrays/period.py in dt64arr_to_periodarr(data, freq, tz)
    914         data = data._values
    915 
--> 916     base, mult = libfrequencies.get_freq_code(freq)
    917     return libperiod.dt64arr_to_periodarr(data.view("i8"), base, tz), freq
    918 

pandas/_libs/tslibs/frequencies.pyx in pandas._libs.tslibs.frequencies.get_freq_code()

pandas/_libs/tslibs/frequencies.pyx in pandas._libs.tslibs.frequencies.get_freq_code()

pandas/_libs/tslibs/frequencies.pyx in pandas._libs.tslibs.frequencies.get_freq_code()

pandas/_libs/tslibs/frequencies.pyx in pandas._libs.tslibs.frequencies._period_str_to_code()

ValueError: Invalid frequency: SM-15

Описание проблемы

Я пытаюсь привести даты к полугодовым периодам. документы для pandas.Series.dt.to_period говорят, что передают одну из смещенных строк , из которых SM является одной.

Он действительно говорит, что ValueErrorповышается при «преобразовании DatetimeArray / Index с нерегулярными значениями, так что частота не может быть выведена». Но я не понимаю, что это значит, и я не нашел ничего в StackOverflow или системе отслеживания проблем панд, объясняющих эту ошибку.

Ожидаемый вывод

Ожидаемый

df['a'].dt.to_period('SM')

дать:

0    2018-04-15
1    2018-04-15
2    2018-04-15
3    2018-04-30
4    2018-04-30
Name: a, dtype: period[SM-15]
Выход pd.show_versions()
INSTALLED VERSIONS
------------------
commit           : None
python           : 3.7.3.final.0
python-bits      : 64
OS               : Darwin
OS-release       : 19.2.0
machine          : x86_64
processor        : i386
byteorder        : little
LC_ALL           : None
LANG             : en_US.UTF-8
LOCALE           : en_US.UTF-8

pandas           : 0.25.3
numpy            : 1.17.3
pytz             : 2019.3
dateutil         : 2.8.1
pip              : 19.3.1
setuptools       : 41.6.0.post20191101
Cython           : None
pytest           : 5.3.1
hypothesis       : 4.50.8
sphinx           : None
blosc            : None
feather          : None
xlsxwriter       : None
lxml.etree       : 4.4.1
html5lib         : None
pymysql          : None
psycopg2         : None
jinja2           : 2.10.3
IPython          : 7.9.0
pandas_datareader: None
bs4              : 4.8.1
bottleneck       : None
fastparquet      : None
gcsfs            : None
lxml.etree       : 4.4.1
matplotlib       : 3.1.2
numexpr          : None
odfpy            : None
openpyxl         : None
pandas_gbq       : None
pyarrow          : 0.15.1
pytables         : None
s3fs             : None
scipy            : 1.3.2
sqlalchemy       : None
tables           : None
xarray           : None
xlrd             : 1.2.0
xlwt             : None
xlsxwriter       : None

1 Ответ

1 голос
/ 23 декабря 2019

Глядя на образец из документов , это не тот способ, которым вы используете SM, когда вход является последовательным.

Я все еще не уверен, кого использовать to_period;однако это действительно дает ожидаемый результат

df['a'] + pd.offsets.SemiMonthEnd()

0   2018-04-15
1   2018-04-15
2   2018-04-15
3   2018-04-30
4   2018-04-30
Name: a, dtype: datetime64[ns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...