'How to get the Isoweek from DatetimeIndex

I have a simple pandas dataframe with a date as index:

import pandas as pd

data = {'date': ['2010-01-04','2014-03-15','2017-07-15','2019-12-28','2005-01-03'],
        'price': [1095.20,1139.15,1126.15,1138.00,1125.80]
        }

df = pd.DataFrame(data, columns = ['date', 'price'])
df['date']= pd.to_datetime(df['date'])

df = df.set_index('date')

I can add columns with year, weekday and week:

df['year'] = df.index.year 
df['dayofweek'] = df.index.weekday

df['week'] = df.index.week

But I found:

pandas.DatetimeIndex.week

Deprecated since version 1.1.0. weekofyear and week have been deprecated. Please use DatetimeIndex.isocalendar().week instead.

This doesn't work

df['isoweek'] = df.index.isocalendar().week

--> AttributeError: 'DatetimeIndex' object has no attribute 'isocalendar'

This doesn't work either:

df['isoweek'] = ""

for i in df.index:
    df.loc[i].isoweek = i.isocalendar()[1]

This does, but still gives me a warning:

for i in df.index:
    df.loc[:, ('isoweek')][i] = i.isocalendar()[1]

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

There is probably a very simple solution for this, but I can't find it...



Solution 1:[1]

I ended up doing this:

df_tmp['week'] = df_tmp.index.map(lambda v: pd.to_datetime(v).isocalendar()[1])

Solution 2:[2]

Try using

df['week'] = df.index.dt.isocalendar().week

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Kyle Dunn
Solution 2 montjoile