web-dev-qa-db-ja.com

pandas.DatetimeIndexの頻度はNoneであり、設定できません

「date」列からDatetimeIndexを作成しました。

sales.index = pd.DatetimeIndex(sales["date"])

これで、インデックスは次のようになります。

DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-04', '2003-01-06',
                   '2003-01-07', '2003-01-08', '2003-01-09', '2003-01-10',
                   '2003-01-11', '2003-01-13',
                   ...
                   '2016-07-22', '2016-07-23', '2016-07-24', '2016-07-25',
                   '2016-07-26', '2016-07-27', '2016-07-28', '2016-07-29',
                   '2016-07-30', '2016-07-31'],
                  dtype='datetime64[ns]', name='date', length=4393, freq=None)

ご覧のとおり、freq属性はNoneです。将来のエラーは、freqの欠落が原因であると思われます。ただし、周波数を明示的に設定しようとすると:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-148-30857144de81> in <module>()
      1 #### DEBUG
----> 2 sales_train = disentangle(df_train)
      3 sales_holdout = disentangle(df_holdout)
      4 result = sarima_fit_predict(sales_train.loc[5002, 9990]["amount_sold"], sales_holdout.loc[5002, 9990]["amount_sold"])

<ipython-input-147-08b4c4ecdea3> in disentangle(df_train)
      2     # transform sales table to disentangle sales time series
      3     sales = df_train[["date", "store_id", "article_id", "amount_sold"]]
----> 4     sales.index = pd.DatetimeIndex(sales["date"], freq="d")
      5     sales = sales.pivot_table(index=["store_id", "article_id", "date"])
      6     return sales

/usr/local/lib/python3.6/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
     89                 else:
     90                     kwargs[new_arg_name] = new_arg_value
---> 91             return func(*args, **kwargs)
     92         return wrapper
     93     return _deprecate_kwarg

/usr/local/lib/python3.6/site-packages/pandas/core/indexes/datetimes.py in __new__(cls, data, freq, start, end, periods, copy, name, tz, verify_integrity, normalize, closed, ambiguous, dtype, **kwargs)
    399                                          'dates does not conform to passed '
    400                                          'frequency {1}'
--> 401                                          .format(inferred, freq.freqstr))
    402 
    403         if freq_infer:

ValueError: Inferred frequency None from passed dates does not conform to passed frequency D

周波数が推測されているようですが、DatetimeIndexのfreq属性にもinferred_freq属性にも格納されていません。両方ともNoneです。誰かが混乱を解消できますか?

13
clstaudt

ここにはいくつかのオプションがあります:

  • pd.infer_freq
  • pd.tseries.frequencies.to_offset

今後のエラーは、周波数の欠落が原因であると思われます。

あなたは、絶対に正しい。よく使うものは次のとおりです。

def add_freq(idx, freq=None):
    """Add a frequency attribute to idx, through inference or directly.

    Returns a copy.  If `freq` is None, it is inferred.
    """

    idx = idx.copy()
    if freq is None:
        if idx.freq is None:
            freq = pd.infer_freq(idx)
        else:
            return idx
    idx.freq = pd.tseries.frequencies.to_offset(freq)
    if idx.freq is None:
        raise AttributeError('no discernible frequency found to `idx`.  Specify'
                             ' a frequency string with `freq`.')
    return idx

例:

idx=pd.to_datetime(['2003-01-02', '2003-01-03', '2003-01-06'])  # freq=None

print(add_freq(idx))  # inferred
DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-06'], dtype='datetime64[ns]', freq='B')

print(add_freq(idx, freq='D'))  # explicit
DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-06'], dtype='datetime64[ns]', freq='D')

asfreqを使用すると、欠落している日付のインデックスが再作成(入力)されるため、探しているものでない場合は注意してください。

周波数を変更するための主要な関数は、asfreq関数です。 DatetimeIndexの場合、これは基本的には薄いですが、date_rangeを生成してreindexを呼び出すreindexの便利なラッパーです。

9
Brad Solomon

3ktのメモとして欠落している日付に関連しているようです。 EdChumが示唆するようにasfreq('D')で「修正」できるかもしれませんが、それはデータ値のない連続したインデックスを提供します。私が作成したいくつかのサンプルデータでうまく動作します:

_df=pd.DataFrame({ 'x':[1,2,4] }, 
   index=pd.to_datetime(['2003-01-02', '2003-01-03', '2003-01-06']) )

df
Out[756]: 
            x
2003-01-02  1
2003-01-03  2
2003-01-06  4

df.index
Out[757]: DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-06'], 
          dtype='datetime64[ns]', freq=None)
_

_freq=None_であることに注意してください。 asfreq('D')を適用すると、これは_freq='D'_に変わります。

_df.asfreq('D')
Out[758]: 
              x
2003-01-02  1.0
2003-01-03  2.0
2003-01-04  NaN
2003-01-05  NaN
2003-01-06  4.0

df.asfreq('d').index
Out[759]: 
DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-04', '2003-01-05',
               '2003-01-06'],
              dtype='datetime64[ns]', freq='D')
_

より一般的には、正確に何をしようとしているのかに応じて、reindex&resampleなどの他のオプションについて以下を確認することをお勧めします。 pandasデータフレーム

5
JohnE

以前のバージョンのpythonにこれがあったかどうかはわかりませんが、3.6には次の簡単な解決策があります。

# 'b' stands for business days
# 'w' for weekly, 'd' for daily, and you get the idea...
df.index.freq = 'b' 
1
mrbTT

よくわかりませんが、同じエラーが発生していました。上記の提案では問題を解決できませんでしたが、以下の解決策を使用して解決しました。

Pandas DatetimeIndex + seasonal_decompose = missing frequency

宜しくお願いします

0
Riz.Khan