将数据框列转换为日期类型以及当月的最后一个工作日

时间:2020-06-19 10:42:01

标签: 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 20        8.6

我想将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

注意我的某些月份是CAPS。

我尝试过:

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

但是让我给出匹配错误,我想是因为CAPS几个月了。

2 个答案:

答案 0 :(得分:1)

这是您要找的吗?利用capitalize方法(在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

答案 1 :(得分:0)

所以我发现我犯的错误是Year部分也被缩写。因此,它应该是%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))