我正尝试生成一个从现在到2040年的随机日期列表。日历基于美国日历。预期结果应该是每个月的一个日期。约束是随机日期必须:
成为美国的工作日(周一至周五)
不是美国假期
在每月第二周之后
预期输出。像这样:
2019-06-26
2019-07-16
2019-08-23
2019-09-19
2019-10-14
...
2039-12-22
以下是我尝试过的内容。我可以满足所有三个约束条件-但只需要一种方法就可以每月随机选择一天。
import datetime
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar as calendar
# create a date range of all workdays from 6-18-19 to end of 2039
dates = pd.bdate_range(start='2019-06-18', end='2039-12-31', freq='B')
# put into a dataframe
df = pd.DataFrame(dates, columns=['Date'])
# calculate the week number
df['Week_Number'] = df['Date'].apply(lambda x: (x.day-1)//7+1)
# create a list of holidays
cal = calendar()
holiday_list = cal.holidays(start='2019-06-18', end='2039-12-31')
# Boolean if Date is a holiday
df['Holiday'] = df['Date'].isin(holiday_list)
# filter out Holidays and dates that are before the third week.
df.loc[(df['Week_Number']> 2) & (df['Holiday'] == False)]
我只是错过了最后一块-如何从该结果中每月退回一天?
或者也许有一种更简单的方法可以不使用我到目前为止尝试过的方法。
答案 0 :(得分:1)
IIUC,您可以这样做:
#assign last line to a variable
m=df.loc[(df['Week_Number']> 2) & (df['Holiday'] == False),'Date'].to_frame()
然后在分组依据下使用sample()
:
(m.groupby([m.Date.dt.month,m.Date.dt.year]).apply(lambda x: x.sample(1))
.reset_index(drop=True))