関数への着信 pandas データフレーム引数に日時インデックスがあることを示すデコレータを追加するにはどうすればよいですか?
パッケージ engarde と validada を見てきましたが、まだ何も見つかりませんでした。関数内でこのチェックを行うこともできますが、デコレータを使用することをお勧めします。
関数への着信 pandas データフレーム引数に日時インデックスがあることを示すデコレータを追加するにはどうすればよいですか?
パッケージ engarde と validada を見てきましたが、まだ何も見つかりませんでした。関数内でこのチェックを行うこともできますが、デコレータを使用することをお勧めします。
@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)
これは、ややパターン化されたものです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