我已经编写了此函数以获取每月的最后一个星期四
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'])
任何人都可以看到出了什么问题吗?
答案 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
中日期的最小和最大之间的日期范围内创建所有星期五.groupby
和year
上使用month
,然后选择.last()
,以获取日期范围内每年的每个月的最后一个星期五。.last()
,所以尝试找出一个月中的哪个星期有最后一个星期五就没有问题。Date
列中找到last_fridays_in_daterange
中的值。
.isin
方法确定收容措施。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)]