Преобразование месячных данных в еженедельные — Python

У меня есть кадр данных, который выглядит так:

ID Date     Volume Sales
1  2020-02   10     4
1  2020-03   8      6
2  2019-12   6      8
2  2019-10   4      10

Данные здесь ежемесячные, и я хотел бы преобразовать их в еженедельные, разделив столбец объема и продаж на количество недель в месяце.

Я пытался это сделать, но добился успеха только в этом столбце за столбцом ... есть ли простой способ сделать это, который также можно было бы обрабатывать в большом наборе данных.

Будет ли это аналогичным шагом при преобразовании еженедельных обратно в ежемесячные? Спасибо!


person tj judge    schedule 27.03.2021    source источник
comment
вы можете использовать атрибут df.columns, и вы можете применить ту же логику к нескольким столбцам, как и для вашего текущего фрейма данных, вы можете использовать df[df.columns[2:]]=df[df.columns[2:]]/7   -  person Anurag Dabas    schedule 27.03.2021
comment
Пожалуйста, добавьте минимальный воспроизводимый фрагмент кода, чтобы можно было решить вашу проблему   -  person blazkowicz    schedule 27.03.2021
comment
вы можете использовать df.resample() с соответствующими аргументами.   -  person Tarique    schedule 27.03.2021


Ответы (1)


Насколько я понимаю, вы можете попробовать создать массив всех недель на основе столбца Date, используя pd.offset, затем взорвать и groupby+transform, чтобы получить количество каждой группы для ее использования в делении:

s = pd.to_datetime(df['Date'])
u = (df.assign(Weeks=[pd.date_range(*x,freq='W')
                  for x in zip(s,s.add(pd.offsets.MonthEnd()))]).explode("Weeks"))

u[['Volume','Sales']] = u[['Volume','Sales']].div(
                        u.groupby("Date")['Date'].transform("count"),axis=0)

print(u)

   ID     Date  Volume  Sales      Weeks
0   1  2020-02     2.5    1.0 2020-02-02
0   1  2020-02     2.5    1.0 2020-02-09
0   1  2020-02     2.5    1.0 2020-02-16
0   1  2020-02     2.5    1.0 2020-02-23
1   1  2020-03     1.6    1.2 2020-03-01
1   1  2020-03     1.6    1.2 2020-03-08
1   1  2020-03     1.6    1.2 2020-03-15
1   1  2020-03     1.6    1.2 2020-03-22
1   1  2020-03     1.6    1.2 2020-03-29
2   2  2019-12     1.2    1.6 2019-12-01
2   2  2019-12     1.2    1.6 2019-12-08
2   2  2019-12     1.2    1.6 2019-12-15
2   2  2019-12     1.2    1.6 2019-12-22
2   2  2019-12     1.2    1.6 2019-12-29
3   2  2019-10     1.0    2.5 2019-10-06
3   2  2019-10     1.0    2.5 2019-10-13
3   2  2019-10     1.0    2.5 2019-10-20
3   2  2019-10     1.0    2.5 2019-10-27
person anky    schedule 27.03.2021
comment
Спасибо за ответ. Вопрос: Будет ли такая же логика преобразовывать еженедельные данные в ежемесячные? - person tj judge; 28.03.2021