sagarpavan
sagarpavan

Reputation: 95

Function to update the week number in python

I am writing a function to update the week number of any year date falls in between Dec29-Jan3. I tried as below and called function, but its showing exception as

('strptime() argument 1 must be string, not Series', u'occurred at index 0')

enter image description here

def week_number_update(x):
  dec_day = [29,30,31]
  jan_day = [1,2,3]
  input_date = datetime.datetime.strptime(x, "%Y-%m-%d")
  input_month = input_date.month
  input_day = input_date.day
  if input_month == 12:
    if input_day in dec_day:
      week_number = datetime.date(input_date.year, 12, 28).isocalendar()[1]
  elif input_month == 1:
    if input_day in jan_day:
      week_number = datetime.date(input_date.year, 1, 4).isocalendar()[1]
  else:
    week_number = x['date'].dt.week

  return(week_number);

Calling:
df['week'] = df.apply(lambda x: week_number_update(x), axis=1)

Thanks.

Upvotes: 1

Views: 50

Answers (1)

jezrael
jezrael

Reputation: 862661

I believe you need if input column is datetime:

rng = pd.date_range('2017-12-27', periods=10) | pd.date_range('2018-12-27', periods=10) | \
      pd.date_range('2019-12-27', periods=10) | pd.date_range('2020-12-27', periods=10)
df = pd.DataFrame(rng)  
#print (df)


def week_number_update(input_date):
  dec_day = [29,30,31]
  jan_day = [1,2,3]
  input_month = input_date.month
  input_day = input_date.day

  if input_month == 12 and input_day in dec_day:
      week_number = date(input_date.year, 12, 28).isocalendar()[1]
  elif input_month == 1 and input_day in jan_day:
      week_number = date(input_date.year, 1, 4).isocalendar()[1]
  else:
      week_number = input_date.week

  return week_number

df['week'] = df[0].apply(week_number_update) 
df['week_orig'] = df[0].dt.week

print (df)

            0  week  week_orig
0  2017-12-27    52         52
1  2017-12-28    52         52
2  2017-12-29    52         52
3  2017-12-30    52         52
4  2017-12-31    52         52
5  2018-01-01     1          1
6  2018-01-02     1          1
7  2018-01-03     1          1
8  2018-01-04     1          1
9  2018-01-05     1          1
10 2018-12-27    52         52
11 2018-12-28    52         52
12 2018-12-29    52         52
13 2018-12-30    52         52
14 2018-12-31    52          1
15 2019-01-01     1          1
16 2019-01-02     1          1
17 2019-01-03     1          1
18 2019-01-04     1          1
19 2019-01-05     1          1
20 2019-12-27    52         52
21 2019-12-28    52         52
22 2019-12-29    52         52
23 2019-12-30    52          1
24 2019-12-31    52          1
25 2020-01-01     1          1
26 2020-01-02     1          1
27 2020-01-03     1          1
28 2020-01-04     1          1
29 2020-01-05     1          1
30 2020-12-27    52         52
31 2020-12-28    53         53
32 2020-12-29    53         53
33 2020-12-30    53         53
34 2020-12-31    53         53
35 2021-01-01     1         53
36 2021-01-02     1         53
37 2021-01-03     1         53
38 2021-01-04     1          1
39 2021-01-05     1          1

Upvotes: 1

Related Questions