Как я могу реплицировать ежемесячные данные по неделям в Excel с помощью python?

#python #excel #pandas #replication

#python #excel #pandas #репликация

Вопрос:

У меня есть ежемесячные данные с января 2016 года по июль 2020 года. Мне нужно, чтобы они реплицировались через недели, начиная с понедельника.

Я пытался использовать resample и ffill(), но поскольку периоды одинаковы в разных городах и автомобилях, я не могу их использовать.

*df = df.resample('W-MON').ffill()*

Я получаю следующую ошибку:

 ***ValueError: cannot reindex a non-unique index with a method or limit.***
 

Исходный df выглядит следующим образом:

 Car type    num_month   Sales   City    Car model
P       01-01-2016     100     X       A
P       01-02-2016     200     X       A
Q       01-01-2016     223     X       B
Q       01-02-2016     123     X       B
R       01-01-2016     456     X       C
R       01-02-2016     678     X       C
S       01-01-2016     345     X       D
S       01-02-2016     123     X       D
T       01-01-2016     876     X       E
T       01-02-2016     567     X       E
U       01-01-2016     780     X       F
U       01-02-2016     543     X       F
P       01-01-2016     766     Y       A
P       01-02-2016     465     Y       A
Q       01-01-2016     452     Y       B
Q       01-02-2016     1234    Y       B
R       01-01-2016     353     Y       C
R       01-02-2016     566     Y       C
S       01-01-2016     564     Y       D
 

Требуемый файл выглядит так:

 Car type    num_month       Week        Sales    City   Car model
    P       01-01-2016      04-01-2016      100     X       A
    Q       01-01-2016      04-01-2016      223     X       B
    R       01-01-2016      04-01-2016      456     X       C
    U       01-01-2016      04-01-2016      780     X       F
    S       01-01-2016      04-01-2016      345     X       D
    T       01-01-2016      04-01-2016      876     X       E
    P       01-01-2016      11-01-2016      100     X       A
    Q       01-01-2016      11-01-2016      223     X       B
    R       01-01-2016      11-01-2016      456     X       C
    U       01-01-2016      11-01-2016      780     X       F
    S       01-01-2016      11-01-2016      345     X       D
    T       01-01-2016      11-01-2016      876     X       E
    P       01-01-2016      18-01-2016      100     X       A
    Q       01-01-2016      18-01-2016      223     X       B
    R       01-01-2016      18-01-2016      456     X       C
    U       01-01-2016      18-01-2016      780     X       F
    S       01-01-2016      18-01-2016      345     X       D
    T       01-01-2016      18-01-2016      876     X       E
    P       01-01-2016      25-01-2016      100     X       A
    Q       01-01-2016      25-01-2016      223     X       B
    R       01-01-2016      25-01-2016      456     X       C
    U       01-01-2016      25-01-2016      780     X       F
    S       01-01-2016      25-01-2016      345     X       D
    T       01-01-2016      25-01-2016      876     X       E
    P       01-02-2016      01-02-2016      200     X       A
    Q       01-02-2016      01-02-2016      123     X       B
    R       01-02-2016      01-02-2016      678     X       C
    U       01-02-2016      01-02-2016      564     X       F
    S       01-02-2016      01-02-2016      123     X       D
    T       01-02-2016      01-02-2016      567     X       E
    P       01-02-2016      08-02-2016      200     X       A
    Q       01-02-2016      08-02-2016      123     X       B
    R       01-02-2016      08-02-2016      678     X       C
    U       01-02-2016      08-02-2016      564     X       F
    S       01-02-2016      08-02-2016      123     X       D
    T       01-02-2016      08-02-2016      567     X       E
    P       01-02-2016      15-02-2016      200     X       A
    Q       01-02-2016      15-02-2016      123     X       B
    R       01-02-2016      15-02-2016      678     X       C
    U       01-02-2016      15-02-2016      564     X       F
    S       01-02-2016      15-02-2016      123     X       D
    T       01-02-2016      15-02-2016      567     X       E
    P       01-02-2016      22-02-2016      200     X       A
    Q       01-02-2016      22-02-2016      123     X       B
    R       01-02-2016      22-02-2016      678     X       C
    U       01-02-2016      22-02-2016      564     X       F
    S       01-02-2016      22-02-2016      564     X       D
    T       01-02-2016      22-02-2016      567     X       E
    P       01-01-2016      04-01-2016      766     Y       A
    Q       01-01-2016      04-01-2016      452     Y       B
    R       01-01-2016      04-01-2016      353     Y       C
    U       01-01-2016      04-01-2016      456     Y       F
    S       01-01-2016      04-01-2016      564     Y       D
    T       01-01-2016      04-01-2016      230     Y       E
    P       01-01-2016      11-01-2016      766     Y       A
    Q       01-01-2016      11-01-2016      452     Y       B
    R       01-01-2016      11-01-2016      353     Y       C
    U       01-01-2016      11-01-2016      456     Y       F
 

Наряду с этим, если дата начала недели равна 27 или больше, так что большая часть недели приходится на следующий месяц, то данные этой недели должны быть включены только в следующий месяц, то есть, если дата недели 29-06-16, соответствующий месяц или «num_month» для того же будет 01-07-2016.

Комментарии:

1. Добро пожаловать в stackoverflow. Обязательно внимательно прочитайте руководство по размещению вопросов. Как правило, публикуйте данные в правильном формате и публикуйте свои собственные попытки решения проблемы.

Ответ №1:

Я рекомендую использовать datetime пакет. datetime.date.today().isocalendar() Возвращает сегодняшний год (2020), неделю года (48) и день недели (6).

Ниже я реплицировал значение для каждого дня месяца. Вы могли бы делать это и в течение недели.

 import datetime

jan_2020_val = 2
feb_2020_val = 3
jan_2021_val = 4
feb_2021_val = 5


curr_date = datetime.date(2020, 1, 1)
end_date = datetime.date(2021, 3, 1)
mydata = []
while curr_date < end_date:
    if curr_date.month == 1 and curr.date.year == 2020:
        mydata.append((curr_date, jan_2020_val))
    if curr_date.month == 2 and curr_date.year == 2020:
        mydata.append((curr_date, feb_2020_val))
    if curr_date.month == 1 and curr_date.year == 2021:
        mydata.append((curr_date, jan_2021_val))
    if curr_date.month == 2 and curr_date.year == 2021:
        mydata.append((curr_date, feb_2021_val)) 
    curr_date  = datetime.timedelta(days=1)
print(mydata)
 

Комментарии:

1. Мне нужно, чтобы это было сделано в течение 4 или более лет. Переменные Jan_val и feb_val не будут работать для этого.

2. Я отредактировал ответ, чтобы показать, как включить дополнительные годы. Вы также можете посмотреть на эту np.select функцию.

3. Большое спасибо за помощь. Однако это не совсем дало правильные результаты. Я обновил свой вопрос, чтобы сделать его более понятным.

Ответ №2:

Я смог решить проблему, сначала создав сводную таблицу, поэтому все модели автомобилей образуют отдельный столбец. Затем, используя цикл for для каждого города, я произвел повторную выборку данных с помощью pd.df.resample.ffill() и, в конечном счете, открепил данные с помощью melt(). Однако за последний месяц я по-прежнему получаю только дату первой недели. Но это все, что мне удалось получить.