Я уверен, что просто не ищу правильную фразу, чтобы ответить на этот вопрос, но в Pandas можно взять любой объект DateTime и добавить или вычесть из него, используя DateOffset, например:
pd.datetime.now() + pd.DateOffset(months=2)
pd.datetime.now() + pd.DateOffset(weeks=4)
pd.datetime.now() + pd.DateOffset(days=2)
и т.п.
Но в другом контексте также используются псевдонимы смещения: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases
Мой вопрос: есть ли способ использовать DateOffset и передать псевдоним смещения для определения основы смещения?
Например: pd.datetime.now() + pd.DateOffset(n=some_int, freq='W')
за some_int
недель?
Если это невозможно, где я должен копать, чтобы получить что-то в этом роде?
(Причина в том, что есть функция, в которой я использую псевдоним смещения, и я не хочу создавать длинный оператор if...else для преобразования строки частоты в разные экземпляры pd.DateOffset(weeks=n | years=n | months=n | etc.)
. Я предпочитаю, чтобы строка частоты диктовала DateOffset в одной строке кода и по-прежнему быть динамическим для обработки разных частот времени.)
Отредактировано: чтобы добавить пользовательскую функцию, которая заботится о том, что мне нужно, но было бы неплохо иметь решение в to_timedelta или DateOffset, чтобы решение было выше по течению и было более эффективным. Например, я хотел бы использовать бизнес-версии всех параметров freq
, которые я использую, чтобы n
мог воспринимать информацию более естественно и необработанно по сравнению с источником, из которого она поступила.
def datedelta(date, n=0, freq='M'):
from pandas import to_datetime, DateOffset
if n == 0:
date_sign = 1
else:
date_sign = np.abs(n)/n
freq = freq.lower()
if freq == 'y':
dtOff = DateOffset(years=abs(n))
elif freq == 'q':
dtOff = DateOffset(quarters=abs(n))
elif freq == 'm':
dtOff = DateOffset(months=abs(n))
elif freq == 'w':
dtOff = DateOffset(weeks=abs(n))
elif freq == 'd':
dtOff = DateOffset(days=abs(n))
else:
raise ValueError("The freq parameter not one of the following: {'Y', 'Q', 'M', 'W', 'D'}")
return to_datetime(date) + date_sign * dtOff