Преобразование столбца dataframe в тип даты с последним рабочим днем ​​месяца - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующий фрейм данных 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

УВЕДОМЛЕНИЕ, что некоторые из моих месяцев написаны ЗАГЛАВНЫМИ БУКВАМИ.

Я пробовал:

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

Но держит меня дает ошибку сопоставления, я предполагаю, что это потому, что некоторые месяцы указаны в CAPS.

Ответы [ 2 ]

1 голос
/ 19 июня 2020

это то, что вы ищете? используйте метод 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
0 голосов
/ 19 июня 2020

Итак, я понял, что совершил ошибку, потому что часть года также была сокращена. Таким образом, он должен быть %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)) 
...