我有一个包含两个日期等的数据框。我需要过滤掉这两个日期之间相差超过两个工作日的行。我必须考虑周末和假期。
*假设10/17/2023是假期...
示例 df:
NAME DATE1 DATE2
CASE1 10/12/2023 10/13/2023 <--- one day difference
CASE2 10/12/2023 10/16/2023 <--- two days difference (weekend)
CASE3 10/12/2023 10/18/2023 <--- three days difference (weekends and holidays)
...
CASEX 10/12/2023 10/19/2023 <--- four days difference (weekends and holidays)
我需要将 CASE3 和 CASEX(有超过两天的差异)保存在另一个数据框中,然后从这个数据框中删除它。
我的做法:
date1 = "10/12/2023"
date2 = "10/19/2023"
date1 = pd.to_datetime(date1, format="%m/%d/%Y").date()
date2 = pd.to_datetime(date2, format="%m/%d/%Y").date()
holidays = [pd.to_datetime("10/17/2023",format="%m/%d/%Y").date()]
days = np.busday_count(date1, date2, holidays=holidays)
“天”我有正确的数字。但我无法在数据框中实现它来过滤它并提取行。
定义假期列表
holidays = np.array([pd.to_datetime("10/17/2023", format="%m/%d/%Y")], dtype='datetime64[D]')
将日期列中的字符串解析为日期时间类型
df['DATE1'] = pd.to_datetime(df['DATE1'], format="%m/%d/%Y")
df['DATE2'] = pd.to_datetime(df['DATE2'], format="%m/%d/%Y")
# NAME DATE1 DATE2
# 0 CASE1 2023-10-12 2023-10-13
# 1 CASE2 2023-10-12 2023-10-16
# 2 CASE3 2023-10-12 2023-10-18
# 3 CASEX 2023-10-12 2023-10-19
将日期转换为
datetime64[D]
类型,然后使用 busy_day
计数来获取差异
days = np.busday_count(df['DATE1'].values.astype("datetime64[D]"),
df['DATE2'].values.astype("datetime64[D]"),
holidays=holidays)
# array([1, 2, 3, 4])
使用布尔索引来过滤行
valid_rows = df[days <= 2]
invalid_rows = df[days > 2]
# valid_rows
# NAME DATE1 DATE2
# 0 CASE1 2023-10-12 2023-10-13
# 1 CASE2 2023-10-12 2023-10-16
# invalid_rows
# NAME DATE1 DATE2
# 2 CASE3 2023-10-12 2023-10-18
# 3 CASEX 2023-10-12 2023-10-19