Python 将dataframe列转换为具有当月最后一个工作日的日期类型

Python 将dataframe列转换为具有当月最后一个工作日的日期类型,python,dataframe,datetime,Python,Dataframe,Datetime,我有以下数据帧df: Date number 0 AUG 17 1.0 1 AUG 17 1.6 2 FEB 18 1.0 3 MAR 18 1.7 4 APR 18 6.0 5 Jan 19 1.0 6 Apr 19 2.0 7 Jun 19 7.1 8 Jan 20 5.5 9 Feb

我有以下数据帧
df

       Date     number
0    AUG 17        1.0
1    AUG 17        1.6
2    FEB 18        1.0
3    MAR 18        1.7
4    APR 18        6.0
5    Jan 19        1.0
6    Apr 19        2.0
7    Jun 19        7.1
8    Jan 20        5.5
9    Feb 20        8.6
我想将
Date
列转换为Date类型(每月的最后一个工作日(星期一到星期五)),以便获得以下输出:

            Date     number
0    2017-08-31        1.0
1    2017-08-31        1.6
2    2018-02-28        1.0
3    2018-03-30        1.7
4    2018-04-30        6.0
5    2019-01-31        1.0
6    2019-04-30        2.0
7    2019-06-28        7.1
8    2020-01-31        5.5
9    2020-02-28        8.6
请注意,我的一些月份是大写的

我试过:

date = [datetime.datetime.strptime(x,'%b%Y').date() for x in df['Date']]

但我总是给出匹配错误,我想这是因为有些月份是大写的。

这就是你要找的吗?使用该方法(也可在
pandas
中找到)解析日期,并从
pd.offsets
添加偏移量,以获得适当的工作日:

import pandas as pd
# example df:
df = pd.DataFrame({'Date': ['AUG 17', 'aug 17', 'FEB 18', 'MAR 18'], 
                   'number': [1, 1.6, 1, 1.7]})
# convert to datetime after capitalizing the month name, add offset so you can get last business day of month
df['Date'] = (pd.to_datetime(df['Date'].str.capitalize(), format='%b %y') + 
              pd.offsets.BMonthEnd(1))
# df
#         Date  number
# 0 2017-08-31     1.0
# 1 2017-08-31     1.6
# 2 2018-02-28     1.0
# 3 2018-03-30     1.7

所以我发现我犯的错误是年份部分也被缩短了。因此它应该是
%y
而不是
%y
,并且它应该在月份和年份之间有一个空格:
%b%y

因此,为了实现我想要的输出:

import pandas as pd
import datetime

# convert the string dates into date type
df['Date'] = [datetime.datetime.strptime(x,'%b %y').date() for x in df['Date']]

#convert to Business Days (Monday-Friday)
df = df.assign(Date=df['Date'] + pd.offsets.BMonthEnd(1)) 

营业日。。通常Mo Fr/Mo Sa?@MrFuppes年份在第一个df中,数字是year@PatrickArtner周一周五是的,我会发布我的代码。我会发布我的答案(不管你的答案是好的还是谢谢你),因为我在使用列表理解的时候有点不同,我会考虑坏的练习(至少是低效的)——如果你使用<代码>熊猫> /CODE >,让熊猫代码做迭代,而不是用你的Python脚本来做。你可以很容易地相应地修改我的答案。