#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(). Однако за последний месяц я по-прежнему получаю только дату первой недели. Но это все, что мне удалось получить.