Ниже представлено небольшое подмножество довольно большого фреймворка данных в python.
ID invoiceDate
1 2017-07-18
2 2017-10-17
3 2017-08-20
4 2017-09-05
5 2017-08-20
6 2017-11-08
7 2017-09-17
8 2017-11-10
9 2017-08-14
10 2017-08-24
Учитывая, что период интереса находится между 2017-07-13
и 2017-11-21
, он эквивалентен 20 неделям. Мне нужно сопоставить каждое значение в invoiceDate
с соответствующим номером недели. Например, 2017-07-18
отображается на неделю №1 (первая неделя начинается и заканчивается на 2017-07-13
и 2017-07-19
соответственно) или 2017-08-20
на неделю №6 (неделя 6 начинается и начинается заканчивается в 2017-08-17
и 2017-08-23
соответственно). invoiceDate
имеет тип объекта.
Используйте to_period
с to_period
"W-Wed", изменяющей начало недели.
s = df['invoiceDate'].dt.to_period('W-Wed').dt.week
df['Week_Num'] = (s - s.min() + 1)
df ['Week_Num'] = (df ['invoiceDate']. dt.to_period ('W-Wed'). dt.week - df ['invoiceDate']. dt.to_period ('W-Wed'). dt. week.min() + 1)
Выход:
productID invoiceDate Week_Num
0 1 2017-07-18 1
1 2 2017-10-17 14
2 3 2017-08-20 6
3 4 2017-09-05 8
4 5 2017-08-20 6
5 6 2017-11-08 17
6 7 2017-09-17 10
7 8 2017-11-10 18
8 9 2017-08-14 5
9 10 2017-08-24 7
IIUC
(df.invoiceDate-pd.to_datetime('2017-07-13')).dt.days//7+1
Out[352]:
0 1
1 14
2 6
3 8
4 6
5 17
6 10
7 18
8 5
9 7
Name: invoiceDate, dtype: int64
Вы ищете что-то вроде этого?
df = pd.DataFrame()
df['ID'] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
df['InvDate'] = ['2017-07-18', '2017-10-17', '2017-08-20', '2017-09-05', '2017-08-20', '2017-11-08', '2017-09-17', '2017-11-10', '2017-08-14', '2017-08-24']
df['InvDate'] = pd.to_datetime(df['InvDate'])
df['WeekNum'] = df['InvDate'].dt.to_period('W').dt.week
df['WeekNum'] = df['WeekNum'] - df['WeekNum'][0] + 1
Выход:
ID InvDate WeekNum
0 1 2017-07-18 1
1 2 2017-10-17 14
2 3 2017-08-20 6
3 4 2017-09-05 8
4 5 2017-08-20 6
5 6 2017-11-08 17
6 7 2017-09-17 10
7 8 2017-11-10 18
8 9 2017-08-14 5
9 10 2017-08-24 7