Рассчитать последнюю пятницу месяца в пандах - PullRequest
0 голосов
/ 09 октября 2018

Я написал эту функцию, чтобы получить последний четверг месяца

def last_thurs_date(date):
    month=date.dt.month
    year=date.dt.year

    cal = calendar.monthcalendar(year, month)
    last_thurs_date = cal[4][4]
    if month < 10:
        thurday_date = str(year)+'-0'+ str(month)+'-' + str(last_thurs_date)
    else:
        thurday_date = str(year) + '-' + str(month) + '-' + str(last_thurs_date)
    return thurday_date

Но она не работает с функцией lamba.

datelist['Date'].map(lambda x: last_thurs_date(x))

Где datelist равен

datelist = pd.DataFrame(pd.date_range(start = pd.to_datetime('01-01-2014',format='%d-%m-%Y')
                                      , end = pd.to_datetime('06-03-2019',format='%d-%m-%Y'),freq='D').tolist()).rename(columns={0:'Date'})
datelist['Date']=pd.to_datetime(datelist['Date'])

Кто-нибудь может увидеть, что идет не так?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Jpp уже добавил решение, но просто чтобы добавить немного более читаемую отформатированную строку - см. потрясающий сайт .

import calendar
def last_thurs_date(date):
    year, month = date.year, date.month
    cal = calendar.monthcalendar(year, month)
    # the last (4th week -> row) thursday (4th day -> column) of the calendar
    # except when 0, then take the 3rd week (February exception)
    last_thurs_date =  cal[4][4] if cal[4][4] > 0 else cal[3][4] 
    return f'{year}-{month:02d}-{last_thurs_date}'

Также добавлено немного логики - например, вы получили 2019-02-0, поскольку в феврале нет 4 полных недель.

0 голосов
/ 09 октября 2018

Скалярные datetime объекты не имеют dt аксессора, серия делает: см. pd.Series.dt.Если вы удалите это, ваша функция работает нормально.Ключ к пониманию состоит в том, что pd.Series.apply передает скаляры в вашу пользовательскую функцию через цикл, а не целую серию.

def last_thurs_date(date):
    month = date.month
    year = date.year

    cal = calendar.monthcalendar(year, month)
    last_thurs_date = cal[4][4]
    if month < 10:
        thurday_date = str(year)+'-0'+ str(month)+'-' + str(last_thurs_date)
    else:
        thurday_date = str(year) + '-' + str(month) + '-' + str(last_thurs_date)
    return thurday_date

Вы можете переписать свою логику более кратко с помощью f-строк (Python 3.6+) и троичное выражение:

def last_thurs_date(date):
    month = date.month
    year = date.year
    last_thurs_date = calendar.monthcalendar(year, month)[4][4]
    return f'{year}{"-0" if month < 10 else "-"}{month}-{last_thurs_date}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...