Python 3 - как обрабатывать 53 недели недели при использовании timedelta () - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь вытянуть последние 12 полных (с понедельника по воскресенье) недель, но у меня ничего не получается, потому что понедельник 2018-12-31 - это 53-я неделя 2018 года.

Я получаю старти даты окончания последних полных 12 недель:

### determine local time day of and day of week
today = dt.utcnow()
today = today.replace(tzinfo=timezone.utc).astimezone(tz.gettz(timezone_id))

### get the last 12 full Monday to Sunday weeks
timeKey1 = (today - datetime.timedelta(days=today.weekday()))- datetime.timedelta(weeks=12)
timeKey2 = (today - datetime.timedelta(days=today.weekday()))- datetime.timedelta(days=1)
timeKey1 = datetime.datetime.strptime(''.join(str(timeKey1).rsplit(':', 1)), '%Y-%m-%d %H:%M:%S.%f%z').strftime('%Y-%m-%d')
timeKey2 = datetime.datetime.strptime(''.join(str(timeKey2).rsplit(':', 1)), '%Y-%m-%d %H:%M:%S.%f%z').strftime('%Y-%m-%d')
print(timeKey1)
print(timeKey2)

, который возвращает диапазон дат с 2018-12-03 по 2019-02-24, что здорово:

2018-12-03
2019-02-24

Итак, когдаЯ использую это для извлечения данных, которые мне нужны за этот период времени, я группирую недели:

### Convert timekey to week of year
df['week'] = df['timekey'].astype(str).apply(lambda x: dt.strptime(x, "%Y%m%d").strftime("%W"))

### group the weeks of year together
df['weekCumulative'] = df['week'].ne(df['week'].shift()).cumsum()

Затем я хочу, чтобы моя функция продолжалась, если максимальное значение в df ['weekCumulative']. Max () == 12:

###Check that 12 weeks is available
if df['weekCumulative'].max() == 12:

Но здесь не получается, потому что понедельник 2018-12-31 оказывается 53-й неделей 2018 года. В приведенной ниже таблице показано следующее:

weekCumulative = week of year grouped by weeks 1 to 12
week = week of year
startDate = date of the Monday in each week
endDate = date of the Sunday in each week

Таблица:

weekCumulative   week       startDate   endDate
    1             49        2018-12-03  2018-12-09
    2             50        2018-12-10  2018-12-16
    3             51        2018-12-17  2018-12-23
    4             52        2018-12-24  2018-12-30
    5             53        2018-12-31  2018-12-31
    6             00        2019-01-01  2019-01-06
    7             01        2019-01-07  2019-01-13
    8             02        2019-01-14  2019-01-20
    9             03        2019-01-21  2019-01-27
    10            04        2019-01-28  2019-02-03
    11            05        2019-02-04  2019-02-10
    12            06        2019-02-11  2019-02-17
    13            07        2019-02-18  2019-02-24

Теперь мы можем видеть, что df ['weekCumulative']. Max () фактически равен 13, потому что понедельник 2018-12-31, оказывается, 53-я неделя из 2018, поэтому он сгруппирован вего собственная группа, где weekCumulative = 5. Когда то, что я на самом деле хочу увидеть, это:

weekCumulative   week       startDate   endDate
    1             49        2018-12-03  2018-12-09
    2             50        2018-12-10  2018-12-16
    3             51        2018-12-17  2018-12-23
    4             52        2018-12-24  2018-12-30
    5             00        2018-12-31  2019-01-06
    6             01        2019-01-07  2019-01-13
    7             02        2019-01-14  2019-01-20
    8             03        2019-01-21  2019-01-27
    9             04        2019-01-28  2019-02-03
    10            05        2019-02-04  2019-02-10
    11            06        2019-02-11  2019-02-17
    12            07        2019-02-18  2019-02-24

Где понедельник 2018-12-31 сгруппирован в крошечныйk 0 из 2019.

Итак, мои вопросы: как это можно сделать так, чтобы мне не приходилось извлекать данные, а затем заменять неделю 53 на 00?Было бы более эффективно обрабатывать это программно.

Буду признателен за любые предложения.

...