creating a weekly range in pandas

Viewed 28

I ran into such a problem, I have the following dataframe

enter image description here

and I would like to convert it to this kind of dataframe

and I would like to convert it to this kind of dataframe

I tried to solve this problem, but without success (( here is the code for creating a small dataframe

data = {'Date':['2020-01-01','2020-01-02','2020-01-03','2020-01-04','2020-01-05','2020-01-06','2020-01-07','2020-01-08','2020-01-09','2020-01-10','2020-01-11','2020-01-12','2020-01-13','2020-01-14'],
        'year':['2020','2020','2020','2020','2020','2020','2020', '2020','2020','2020','2020','2020','2020','2020'],
        'week':['1','1','1','1','1','1','1','2','2','2','2','2','2','2',]}

df_test = pd.DataFrame(data)
1 Answers

First idea is convert per year and week first and last values of Date by GroupBy.transform:

g = df_test.groupby(['year','week'])['Date']
df_test['week range'] = g.transform('first') + '-' + g.transform('last') 
print (df_test)
          Date  year week             week range
0   2020-01-01  2020    1  2020-01-01-2020-01-07
1   2020-01-02  2020    1  2020-01-01-2020-01-07
2   2020-01-03  2020    1  2020-01-01-2020-01-07
3   2020-01-04  2020    1  2020-01-01-2020-01-07
4   2020-01-05  2020    1  2020-01-01-2020-01-07
5   2020-01-06  2020    1  2020-01-01-2020-01-07
6   2020-01-07  2020    1  2020-01-01-2020-01-07
7   2020-01-08  2020    2  2020-01-08-2020-01-14
8   2020-01-09  2020    2  2020-01-08-2020-01-14
9   2020-01-10  2020    2  2020-01-08-2020-01-14
10  2020-01-11  2020    2  2020-01-08-2020-01-14
11  2020-01-12  2020    2  2020-01-08-2020-01-14
12  2020-01-13  2020    2  2020-01-08-2020-01-14
13  2020-01-14  2020    2  2020-01-08-2020-01-14

Or if possible use Series.dt.to_period:

df_test['week range'] = df_test['Date'].dt.to_period('W-TUE')
print (df_test)
         Date  year week             week range
0  2020-01-01  2020    1  2020-01-01/2020-01-07
1  2020-01-02  2020    1  2020-01-01/2020-01-07
2  2020-01-03  2020    1  2020-01-01/2020-01-07
3  2020-01-04  2020    1  2020-01-01/2020-01-07
4  2020-01-05  2020    1  2020-01-01/2020-01-07
5  2020-01-06  2020    1  2020-01-01/2020-01-07
6  2020-01-07  2020    1  2020-01-01/2020-01-07
7  2020-01-08  2020    2  2020-01-08/2020-01-14
8  2020-01-09  2020    2  2020-01-08/2020-01-14
9  2020-01-10  2020    2  2020-01-08/2020-01-14
10 2020-01-11  2020    2  2020-01-08/2020-01-14
11 2020-01-12  2020    2  2020-01-08/2020-01-14
12 2020-01-13  2020    2  2020-01-08/2020-01-14
13 2020-01-14  2020    2  2020-01-08/2020-01-14

per = df_test['Date'].dt.to_period('W-TUE')
df_test['week range'] = (per.dt.to_timestamp().dt.strftime('%Y-%m-%d') + ' - ' + 
                         per.dt.to_timestamp(how='end').dt.strftime('%Y-%m-%d'))
print (df_test)
         Date  year week               week range
0  2020-01-01  2020    1  2020-01-01 - 2020-01-07
1  2020-01-02  2020    1  2020-01-01 - 2020-01-07
2  2020-01-03  2020    1  2020-01-01 - 2020-01-07
3  2020-01-04  2020    1  2020-01-01 - 2020-01-07
4  2020-01-05  2020    1  2020-01-01 - 2020-01-07
5  2020-01-06  2020    1  2020-01-01 - 2020-01-07
6  2020-01-07  2020    1  2020-01-01 - 2020-01-07
7  2020-01-08  2020    2  2020-01-08 - 2020-01-14
8  2020-01-09  2020    2  2020-01-08 - 2020-01-14
9  2020-01-10  2020    2  2020-01-08 - 2020-01-14
10 2020-01-11  2020    2  2020-01-08 - 2020-01-14
11 2020-01-12  2020    2  2020-01-08 - 2020-01-14
12 2020-01-13  2020    2  2020-01-08 - 2020-01-14
13 2020-01-14  2020    2  2020-01-08 - 2020-01-14
Related