Pandas: pandas.infer_freqとpandas.to_timedeltaの間の非互換性

作成日 2016年10月11日  ·  3コメント  ·  ソース: pandas-dev/pandas

問題の小さくて完全な例

pd.infer_freqの出力は「D」ですが、 pd.to_timedeltaは「1D」を想定しています。

import pandas as pd
dates = pd.date_range(start='2016-10-01', end='2016-10-10', freq='1D')
freq = pd.infer_freq(dates)
delta = pd.to_timedelta(freq)

期待される出力

delta = Timedelta( '1 days 00:00:00')

>>> import pandas as pd
>>> dates = pd.date_range(start='2016-10-01', end='2016-10-10', freq='1D')
>>> dates
DatetimeIndex(['2016-10-01', '2016-10-02', '2016-10-03', '2016-10-04',
               '2016-10-05', '2016-10-06', '2016-10-07', '2016-10-08',
               '2016-10-09', '2016-10-10'],
              dtype='datetime64[ns]', freq='D')
>>> freq = pd.infer_freq(dates)
>>> freq
'D'
>>> delta = pd.to_timedelta(freq)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/iivanov/anaconda2/lib/python2.7/site-packages/pandas/util/decorators.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "/home/iivanov/anaconda2/lib/python2.7/site-packages/pandas/tseries/timedeltas.py", line 102, in to_timedelta
    box=box, errors=errors)
  File "/home/iivanov/anaconda2/lib/python2.7/site-packages/pandas/tseries/timedeltas.py", line 148, in _coerce_scalar_to_timedelta_type
    result = tslib.convert_to_timedelta(r, unit, errors)
  File "pandas/tslib.pyx", line 2941, in pandas.tslib.convert_to_timedelta (pandas/tslib.c:52631)
  File "pandas/tslib.pyx", line 3256, in pandas.tslib.convert_to_timedelta64 (pandas/tslib.c:56028)
  File "pandas/tslib.pyx", line 3188, in pandas.tslib.parse_timedelta_string (pandas/tslib.c:54877)
ValueError: unit abbreviation w/o a number

pd.show_versions()出力

インストールされたバージョン

コミット:なし
Python:2.7.12.final.0
python-ビット:64
OS:Linux
OS-リリース:4.4.0-42-generic
マシン:x86_64
プロセッサ:x86_64
バイトオーダー:少し
LC_ALL:なし
言語:en_US.UTF-8

パンダ:0.18.1
鼻:1.3.7
ピップ:8.1.2
setuptools:26.1.1
Cython:0.24.1
numpy:1.11.1
scipy:0.18.0
statsmodels:0.6.1
xarray:なし
IPython:5.1.0
スフィンクス:1.4.1
patsy:0.4.1
dateutil:2.5.3
pytz:2016.6.1
blosc:なし
ボトルネック:1.1.0
表:3.2.3.1
numexpr:2.6.1
matplotlib:1.5.1
openpyxl:2.3.2
xlrd:1.0.0
xlwt:1.1.2
xlsxwriter:0.9.2
lxml:3.6.4
bs4:4.4.1
html5lib:なし
httplib2:なし
apiclient:なし
sqlalchemy:1.0.13
pymysql:なし
psycopg2:なし
jinja2:2.8
ボト:2.40.0
pandas_datareader:なし

Frequency Usage Question

最も参考になるコメント

pd.to_timedeltaは、固定デルタ(基本的には日数以下)のみを処理できます。これは、周波数文字列をデルタとして解析できることをAPIが保証するものではなく、実際、一部の周波数はタイムデルタに変換できません。

In [254]: dates = pd.bdate_range(start='2014-01-01', periods=10)

In [255]: pd.infer_freq(dates)
Out[255]: 'B'

頻度文字列をDateOffsetオブジェクトに変換する必要がある場合は、固定デルタまたは相対デルタにすることができます。 to_offset関数を使用します。

In [253]: from pandas.tseries.frequencies import to_offset

In [256]: to_offset('D')
Out[256]: <Day>

In [257]: to_offset('2D')
Out[257]: <2 * Days>

In [258]: to_offset('B')
Out[258]: <BusinessDay>

全てのコメント3件

pd.to_timedeltaは、固定デルタ(基本的には日数以下)のみを処理できます。これは、周波数文字列をデルタとして解析できることをAPIが保証するものではなく、実際、一部の周波数はタイムデルタに変換できません。

In [254]: dates = pd.bdate_range(start='2014-01-01', periods=10)

In [255]: pd.infer_freq(dates)
Out[255]: 'B'

頻度文字列をDateOffsetオブジェクトに変換する必要がある場合は、固定デルタまたは相対デルタにすることができます。 to_offset関数を使用します。

In [253]: from pandas.tseries.frequencies import to_offset

In [256]: to_offset('D')
Out[256]: <Day>

In [257]: to_offset('2D')
Out[257]: <2 * Days>

In [258]: to_offset('B')
Out[258]: <BusinessDay>

ところで、特定のタイプでは、このようなオフセットをタイムデルタに変換できます。

In [19]: pd.to_timedelta(to_offset('D'))
Out[19]: Timedelta('1 days 00:00:00')

In [20]: pd.to_timedelta(to_offset('B'))
...
ValueError: Invalid type for timedelta scalar: <class 'pandas.tseries.offsets.BusinessDay'>

(または代替to_offset('D').delta
上記の@ chris-b1のように、相対オフセットはタイムデルタに変換できないため、これもエラーになります。

コメントありがとうございます! 今では理にかなっています。

このページは役に立ちましたか?
0 / 5 - 0 評価