Почему W-DAY ведет себя в Пандах смущающе? - PullRequest
1 голос
/ 09 июля 2019

Поведение freq = "W-SUN" и т. Д. Кажется запутанным и непоследовательным. Например, d.date_range(pd.Timestamp('2019-07-09'), pd.Timestamp('2019-11-11'), freq='W-SUN') производит последовательность воскресений, а pd.Index([pd.Timestamp('2019-07-09')]).to_period('W-SUN').to_timestamp() производит понедельник. Что здесь происходит?

Это произошло потому, что у меня есть индекс дат, который я хочу округлить до некоторой частоты, а также генерировать date_range с той же частотой и фазой. Кажется, что index.to_period(freq).to_timestamp() и pd.date_range(start, end, freq=freq) должны работать для этого, но это не работает, когда freq равен "W-DAY".

1 Ответ

2 голосов
/ 09 июля 2019

Это немного нелогично, но вот логика.Когда вы используете .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')

Обратите внимание, что начало выбранного периода переходит в середину, но логика остается неизменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...