计算每月的最后一个星期五在熊猫

时间:2018-10-09 12:59:28

标签: python pandas datetime

我已经编写了此函数以获取每月的最后一个星期四

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 = 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'])

任何人都可以看到出了什么问题吗?

3 个答案:

答案 0 :(得分:3)

标量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}'

答案 1 :(得分:3)

Jpp已经添加了解决方案,但是只是添加了一个更具可读性的格式化字符串-请参见此awesome website

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,因为2月没有整整4周。

答案 2 :(得分:0)

  • 此问题的答案计算每月的最后一个星期五在熊猫中
    • 可以通过选择一周中的适当日期(在此处freq='W-FRI'
    • 对此进行修改)
  • 我认为最简单的方法是使用pandas.DataFrame并指定pandas.date_range创建freq='W-FRI
    • W-FRI是每周的星期五
    • pd.date_range(df.Date.min(), df.Date.max(), freq='W-FRI')
      • df中日期的最小和最大之间的日期范围内创建所有星期五
    • .groupbyyear上使用month,然后选择.last(),以获取日期范围内每年的每个月的最后一个星期五。
  • 因为此方法找到了该范围内每个月的所有星期五,然后为每个月选择.last(),所以尝试找出一个月中的哪个星期有最后一个星期五就没有问题。
  • 通过此操作,使用pandas: Boolean Indexing在数据框的Date列中找到last_fridays_in_daterange中的值。
    • 使用.isin方法确定收容措施。
  • pandas: DateOffset objects
import pandas as pd

# test data: given a dataframe with a datetime column
df = pd.DataFrame({'Date': pd.date_range(start=pd.to_datetime('2014-01-01'), end=pd.to_datetime('2020-08-31'), freq='D')})

# create a dateframe with all Fridays in the daterange for min and max of df.Date
fridays = pd.DataFrame({'datetime': pd.date_range(df.Date.min(), df.Date.max(), freq='W-FRI')})

# use groubpy and last, to get the last Friday of each month into a list
last_fridays_in_daterange = fridays.groupby([fridays.datetime.dt.year, fridays.datetime.dt.month]).last()['datetime'].tolist()

# find the data for the last Friday of the month
df[df.Date.isin(last_fridays_in_daterange)]