Это немного нелогично, но вот логика.Когда вы используете .to_period()
, Pandas вычисляет период времени, в который попадает указанная вами дата.Способ, которым Pandas рассчитывает этот период, заключается в том, чтобы найти следующий день, который соответствует указанной вами частоте, и продлить период назад, чтобы включить выбранный вами день.Другими словами, период включает в себя конец, не включает начало .
Чтобы найти привязанную к воскресенью неделю для данного вторника, он находит в следующее воскресенье после этого вторника и добавляет предыдущие шесть дней.Однако при преобразовании в метку времени выбирается первый день этого периода , который в этом случае будет понедельником.Если вы попросите привязанный к воскресенью период воскресенья, он даст вам этот день плюс предыдущие шесть дней, а не следующие шесть дней.
Если вы хотите, чтобы ваш период начинался, а не заканчивался на определенномдень недели, просто установите строку частоты на предыдущий день.В вашем случае pd.Index([pd.Timestamp('2019-07-09')]).to_period('W-SAT').to_timestamp()
должен сделать свое дело.
Некоторые, надеюсь, полезные демонстрации:
pd.Index([pd.Timestamp('2019-07-09')]).to_period('W-SUN')
дает:
PeriodIndex(['2019-07-08/2019-07-14'], dtype='period[W-SUN]', freq='W-SUN
Обратите внимание, что этот период заканчивается в воскресенье.Когда вы запускаете pd.Index([pd.Timestamp('2019-07-09')]).to_period('W-SUN').to_timestamp()
, это дает вам первый день этого периода:
DatetimeIndex(['2019-07-08'], dtype='datetime64[ns]', freq=None)
Вы можете наблюдать, как выбираются дни, запустив:
for f in ['W-SUN', 'W-MON', 'W-TUE', 'W-WED', 'W-THU', 'W-FRI', 'W-SAT']:
print(f, pd.Index([pd.Timestamp('2019-07-09')]).to_period(f))
Что дает:
PeriodIndex(['2019-07-08/2019-07-14'], dtype='period[W-SUN]', freq='W-SUN')
PeriodIndex(['2019-07-09/2019-07-15'], dtype='period[W-MON]', freq='W-MON')
PeriodIndex(['2019-07-03/2019-07-09'], dtype='period[W-TUE]', freq='W-TUE')
PeriodIndex(['2019-07-04/2019-07-10'], dtype='period[W-WED]', freq='W-WED')
PeriodIndex(['2019-07-05/2019-07-11'], dtype='period[W-THU]', freq='W-THU')
PeriodIndex(['2019-07-06/2019-07-12'], dtype='period[W-FRI]', freq='W-FRI')
PeriodIndex(['2019-07-07/2019-07-13'], dtype='period[W-SAT]', freq='W-SAT')
Обратите внимание, что начало выбранного периода переходит в середину, но логика остается неизменной.