用于更新python中的周数的函数

问题描述 投票:1回答:1

我正在编写一个函数来更新任何年份的星期数,在12月29日至1月3日之间。我尝试如下并调用函数,但它显示异常为

('strptime()参数1必须是字符串,而不是系列',u'occurred在索引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);

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

谢谢。

python pandas
1个回答
1
投票

如果输入列是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
© www.soinside.com 2019 - 2024. All rights reserved.