4

関数への着信 pandas データフレーム引数に日時インデックスがあることを示すデコレータを追加するにはどうすればよいですか?

パッケージ engarde と validada を見てきましたが、まだ何も見つかりませんでした。関数内でこのチェックを行うこともできますが、デコレータを使用することをお勧めします。

4

2 に答える 2

5

@PadraicCunningham が書いているように、次を使用して作成するのはそれほど難しくありませんfunctools.wraps

import functools

def assert_index_datetime(f):
    @functools.wraps(f)
    def wrapper(df):
        assert df.index.dtype == pd.to_datetime(['2013']).dtype
        return f(df)
    return wrapper

@assert_index_datetime
def fn(df):
    pass

df = pd.DataFrame({'a': [1]}, index=pd.to_datetime(['2013']))
fn(df)
于 2016-02-03T20:41:09.023 に答える
2

これは、ややパターン化されたものですengarde

In [84]: def has_datetimeindex(func):
    ...:     @wraps(func)
    ...:     def wrapper(df, *args, **kwargs):
    ...:         assert isinstance(df.index, pd.DatetimeIndex)
    ...:         return func(df, *args, **kwargs)
    ...:     return wrapper

In [85]: @has_datetimeindex
    ...: def f(df):
    ...:     return df + 1

In [86]: df = pd.DataFrame({'a':[1,2,3]})

In [87]: f(df)
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-87-ce83b19059ea> in <module>()
----> 1 f(df)

<ipython-input-84-1ecf9973e7d5> in wrapper(df, *args, **kwargs)
      2     @wraps(func)
      3     def wrapper(df, *args, **kwargs):
----> 4         assert isinstance(df.index, pd.DatetimeIndex)
      5         return func(df, *args, **kwargs)
      6     return wrapper

AssertionError: 

In [88]: df = pd.DataFrame({'a':[1,2,3]}, index=pd.date_range('2014-1-1', periods=3))

In [89]: f(df)
Out[89]: 
            a
2014-01-01  2
2014-01-02  3
2014-01-03  4
于 2016-02-03T20:40:58.917 に答える