Home > OS >  How do I specify certain date as the first week and calculate the week number in pandas?
How do I specify certain date as the first week and calculate the week number in pandas?

Time:02-20

how to convert time to week number

year_start = '2019-05-21'

year_end = '2020-02-22'

How do I get the week number based on the date that I set as first week? For example 2019-05-21 should be Week 1 instead of 2019-01-01

CodePudding user response:

If you just need a function to calculate week no, based on given start and end date:

import pandas as pd
import numpy as np

start_date = "2019-05-21"
end_date = "2020-02-22"
start_datetime = pd.to_datetime(start_date)
end_datetime = pd.to_datetime(end_date)

def get_week_no(date):
    given_datetime = pd.to_datetime(date)
    # if date in range
    if start_datetime <= given_datetime <= end_datetime:
        x =  given_datetime - start_datetime
        # adding 1 as it will return 0 for 1st week
        return int(x / np.timedelta64(1, 'W'))   1
    raise ValueError(f"Date is not in range {start_date} - {end_date}")

print(get_week_no("2019-05-21"))

In the function, we are calculating week no by finding difference between given date and start date in weeks.

CodePudding user response:

Try the following code.

import numpy as np
import pandas as pd

year_start = '2019-05-21'
year_end = '2020-02-22'

# Create a sample dataframe
df = pd.DataFrame(pd.date_range(year_start, year_end, freq='D'), columns=['date'])

# Add the week number
df['week_number'] = (((df.date.view(np.int64) - pd.to_datetime([year_start]).view(np.int64)) / (1e9 * 60 * 60 * 24) - df.date.dt.day_of_week   7) // 7   1).astype(np.int64)
date week_number
2019-05-21 1
2019-05-22 1
2019-05-23 1
2019-05-24 1
2019-05-25 1
2019-05-26 1
2019-05-27 2
2019-05-28 2
2020-02-18 40
2020-02-19 40
2020-02-20 40
2020-02-21 40
2020-02-22 40

CodePudding user response:

If you do not have dates outside of year_start/year_end, use isocalendar().week and perform a simple subtraction with modulo:

year_start = pd.to_datetime('2019-05-21')
#year_end = pd.to_datetime('2020-02-22')

df = pd.DataFrame({'date': pd.date_range('2019-05-21', '2020-02-22', freq='30D')})

df['week'] = (df['date'].dt.isocalendar().week.astype(int)-year_start.isocalendar()[1])R 1

Output:

        date  week
0 2019-05-21     1
1 2019-06-20     5
2 2019-07-20     9
3 2019-08-19    14
4 2019-09-18    18
5 2019-10-18    22
6 2019-11-17    26
7 2019-12-17    31
8 2020-01-16    35
9 2020-02-15    39
  • Related