python - 第二周后每月的随机日期

标签 python pandas datetime

我正在尝试生成一个从现在到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)]


我只是错过了最后一块-如何从该结果中每月返回一天?

或者,也许有一种更简单的方法,它们不使用我到目前为止尝试过的方法。

最佳答案

IIUC,您可以执行以下操作:

#assign last line to a variable
m=df.loc[(df['Week_Number']> 2) & (df['Holiday'] == False),'Date'].to_frame() 


然后在groupby下使用sample()

(m.groupby([m.Date.dt.month,m.Date.dt.year]).apply(lambda x: x.sample(1))
                                                  .reset_index(drop=True))

关于python - 第二周后每月的随机日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56652381/

相关文章:

python - MySQL Python 不正确的日期时间值

python - 将从 pd.df ['x' ].mode()[0] 获得的值连接到字典中的键

python - Pandas/Python 等价于 R 中的复杂 ifelse 匹配

python - 使用月平均值的 Pandas fillna 缺失小时时间点数据的方法

python - pandas - 根据第一次出现的条件删除行

python - 更改facetgrid 上每个hist 面的颜色?

c# - DateTime.Now 是否有自己的 GetHashCode 实现来提供唯一的哈希值?

python - 使用 Regex - Python27 匹配精确的数字和单词数

python - 使用 IIS 6 托管 Mercurial

database - 查询最后一天、上周、上个月 SQLite