Python Pandas 按周末和假期两列中的差异天数过滤行

问题描述 投票:0回答:1

我有一个包含两个日期等的数据框。我需要过滤掉这两个日期之间相差超过两个工作日的行。我必须考虑周末和假期。

*假设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)

“天”我有正确的数字。但我无法在数据框中实现它来过滤它并提取行。

python pandas date-difference weekend
1个回答
0
投票

代码

定义假期列表

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
© www.soinside.com 2019 - 2024. All rights reserved.