Использование смещения в 1 Вт - хотелось бы, чтобы это смещение на одну неделю толкало текущий TS к началу следующей недели - PullRequest
0 голосов
/ 29 марта 2020

Первоначальная постановка задачи

Учитывая отметку времени '2020-03-24 10:00' (вторник), я хотел бы получить начало следующей недели (понедельник 00:00), используя недельный DateOffset.

Я намерен понять, как работает DateOffset.

Вот мои попытки, пока что все терпят неудачу.

# ts being timestamp for Tuesday the 24th
ts = pd.Timestamp('2020-03-24 10:00')
# I am looking for the offset that will give me Monday the 30th 00:00

# Attempt 1 / by use of to_offset()
off1 = pd.tseries.frequencies.to_offset('1W')
ts1 = ts + off1
# ts1 is set to next Sunday the 29th 00:00, why this specific date?
# Begining of week is Monday the 30th 00:00
ts1
>>> Out: Timestamp('2020-03-29 00:00:00')

# Attempt 2 / by use of DateOffset(weeks=1)
off2 = pd.tseries.offsets.DateOffset(weeks=1)
ts2 = ts + off2
# ts2 is now Tuesday the 31st 00:00
# It is not what I am looking for, but it makes sense.
# This offset is shifting current date to 7 days later, ok.
ts2
>>> Out: Timestamp('2020-03-31 00:00:00')

# Attempt 3 / by use of DateOffset(weekday=1)
off3 = pd.tseries.offsets.DateOffset(weekday=1)
ts3 = ts + off3
# This time, I cannot figure any reason why the timestamp is
# simply not modified.
ts3
>>> Out: Timestamp('2020-03-24 10:00:00')

Пожалуйста, есть кто-нибудь объяснение результатов ts1 & TS3. Какие логики c следуют за вычислениями, которые им удалось получить?

И, наконец, кто-нибудь знает, как «заменить» значение метки времени на начало следующей недели? (Я хотел бы получить этот результат с помощью ts3 и надеяться получить тот же результат с ts1, но в настоящее время это сбой).

Завершено постановка задачи

Первый ответ приведен ниже. Support использование привязанного DateOffset, который действительно связывает начало следующей недели с моими ожиданиями: привязка к понедельнику.

Но теперь, ища согласованность, если я использую это же привязанное смещение для создания PeriodIndex, недели появляются на якорь во вторник?!

# ts being timestamp for Tuesday the 24th
ts = pd.Timestamp('2020-03-24 10:00')
ts_end=pd.Timestamp('2020-04-16 10:00')
# Offset
off1 = pd.tseries.frequencies.to_offset('W-MON')
# PeriodIndex
pi = pd.period_range(start=ts_start, end=ts_end, freq=off1)
# Checking anchoring day of created PeriodIndex:
pi[1].start_time
>>> Out: Timestamp('2020-03-31 00:00:00')

Что это за тайна?

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Пожалуйста, примите во внимание этот код:

# ts being timestamp for Tuesday the 24th
ts = pd.Timestamp('2020-03-24 10:00')
# use right offset to start with monday
off1 = pd.tseries.frequencies.to_offset('W-MON')
# add values
ts1 = ts + off1
# call normalize to start at midnight
ts1 = ts1.normalize()

Для 'W-MON' см. 'Якорные смещения', для normalize () для поиска на странице ' используйте normalize () '.


РЕДАКТИРОВАТЬ # 1
Отвечая на ваш вопрос о редактировании «mystery»: используйте pi[0].start_time вместо pi[1].start_time, чтобы получить первый элемент. Тогда вы получите

pi[0].start_time
>>2020-03-24 00:00:00

Однако я не могу сказать вам, почему он сгенерировал 03- 24 точно, но очень вероятно, что функция найдет предыдущую дату, соответствующую начало недели с weekday, указанным в frequency, а затем использует одну неделю (ровно 7 дней) в качестве частоты. Это (по-видимому) испечено фактом, если каждый использует

off1 = pd.tseries.frequencies.to_offset('1W-FRI') #weekday = 4
pi[0].start_time
>> 2020-03-21 00:00:00
pi[0].end_time
>> 2020-03-27 23:59:59.999999999
pi[1].start_time
>> 2020-03-28 00:00:00
pi[1].end_time
>> 2020-04-03 23:59:59.999999999

, то есть диапазоны начинаются с субботы. Вы можете использовать рассчитанную желаемую дату в качестве начала (как показано выше) и указать частоту как '1W' без привязок.

# ts being timestamp for Tuesday the 24th
ts = pd.Timestamp('2020-03-24 10:00')
# use right offset to start with monday
off1 = pd.tseries.frequencies.to_offset('W-MON')
# add values
ts1 = ts + off1
# call normalize to start at midnight
ts1 = ts1.normalize()
#ts1 is 2020-03-30 00:00:00
ts_end=pd.Timestamp('2020-04-16 10:00')
# PeriodIndex
pi = pd.period_range(start=ts1, end=ts_end, freq= to_offset('1W'))

pi[0].start_time
>> 2020-03-30 00:00:00

pi[-1].start_time
>> 2020-04-13 00:00:00

pi[-1].end_time
>> 2020-04-19 23:59:59.999999999

Надеюсь, это поможет.

0 голосов
/ 29 марта 2020

из Python 3.8+ у модуля datetime есть новый метод класса .fromisocalendar

@classmethod
def fromisocalendar(cls, year, week, day):
    """Construct a date from the ISO year, week number and weekday.

    This is the inverse of the date.isocalendar() function"""

Учитывая, что у вас есть pandas объект datetime,

from datetime import date
week = ts.week +1
year = ts.year 

new_date = date.fromisocalendar(year,week,1)
print(new_date)

2020-03-30
...