Причина, по которой вы сталкиваетесь с этой ошибкой, заключается в том, что вы переходите от часовых расчетов к календарным вычислениям.Час работает, потому что ваш индекс в часах.День работает, потому что это абсолютный день, 24 часа.Неделя заканчивается неудачей, потому что она ищет календарный день, и у вас есть несколько дней, поэтому возникает ошибка «дублирующая ось», которая говорит о том, что у вас есть несколько повторяющихся элементов, которые вы делаете, так как она ищет календарные дни.
Например, если вы попытаетесь использовать 'B' для рабочего дня, это приведет к той же ошибке дублирующейся оси.
Простой обходной путь - использовать 7 дней * 24 часа = 168часов в неделю.
# create dataframe
index = pd.date_range('2018-01-01', periods=30000, freq='H')
data = np.random.rand(30000)
df = pd.DataFrame(data, index, columns=['data'])
df['change'] = df.data.pct_change(freq='168H')
df.iloc[165:170, :]
data change
2018-01-07 21:00:00 0.692558 NaN
2018-01-07 22:00:00 0.818543 NaN
2018-01-07 23:00:00 0.242034 NaN
2018-01-08 00:00:00 0.032420 -0.933596
2018-01-08 01:00:00 0.004672 -0.994401