如何使用 Pandas 计算两个日期之间的工作日数量
How to calculate the quantity of business days between two dates using Pandas
我创建了一个 pandas df,其中包含名为 start_date 和 current_date 的列。两列的 dtype 都是 datetime64[ns]。查找 current_date 和 start_date 列之间的工作日数量的最佳方法是什么?
我试过:
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay
us_bd = CustomBusinessDay(calendar=USFederalHolidayCalendar())
projects_df['start_date'] = pd.to_datetime(projects_df['start_date'])
projects_df['current_date'] = pd.to_datetime(projects_df['current_date'])
projects_df['days_count'] = len(pd.date_range(start=projects_df['start_date'], end=projects_df['current_date'], freq=us_bd))
我收到以下错误消息:
Cannot convert input....start_date, dtype: datetime64[ns]] of type <class 'pandas.core.series.Series'> to Timestamp
我正在使用 Python 版本 3.10.4。
pd.date_range
的参数需要是日期时间,而不是系列。
因此,我们可以使用 df.apply
将函数应用于每一行。
此外,pandas 有 bdate_range
,这只是 date_range
,freq
默认为工作日,这正是您所需要的。
使用 apply 和 lambda 函数,我们可以创建一个新系列,计算每一行的每个开始日期和当前日期之间的工作日。
projects_df['start_date'] = pd.to_datetime(projects_df['start_date'])
projects_df['current_date'] = pd.to_datetime(projects_df['current_date'])
projects_df['days_count'] = projects_df.apply(lambda row: len(pd.bdate_range(row['start_date'], row['current_date'])), axis=1)
使用 10 个日期对的随机样本,我的输出如下:
start_date current_date bdays
0 2022-01-03 17:08:04 2022-05-20 00:53:46 100
1 2022-04-18 09:43:02 2022-06-10 16:56:16 40
2 2022-09-01 12:02:34 2022-09-25 14:59:29 17
3 2022-04-02 14:24:12 2022-04-24 21:05:55 15
4 2022-01-31 02:15:46 2022-07-02 16:16:02 110
5 2022-08-02 22:05:15 2022-08-17 17:25:10 12
6 2022-03-06 05:30:20 2022-07-04 08:43:00 86
7 2022-01-15 17:01:33 2022-08-09 21:48:41 147
8 2022-06-04 14:47:53 2022-12-12 18:05:58 136
9 2022-02-16 11:52:03 2022-10-18 01:30:58 175
我创建了一个 pandas df,其中包含名为 start_date 和 current_date 的列。两列的 dtype 都是 datetime64[ns]。查找 current_date 和 start_date 列之间的工作日数量的最佳方法是什么?
我试过:
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay
us_bd = CustomBusinessDay(calendar=USFederalHolidayCalendar())
projects_df['start_date'] = pd.to_datetime(projects_df['start_date'])
projects_df['current_date'] = pd.to_datetime(projects_df['current_date'])
projects_df['days_count'] = len(pd.date_range(start=projects_df['start_date'], end=projects_df['current_date'], freq=us_bd))
我收到以下错误消息:
Cannot convert input....start_date, dtype: datetime64[ns]] of type <class 'pandas.core.series.Series'> to Timestamp
我正在使用 Python 版本 3.10.4。
pd.date_range
的参数需要是日期时间,而不是系列。
因此,我们可以使用 df.apply
将函数应用于每一行。
此外,pandas 有 bdate_range
,这只是 date_range
,freq
默认为工作日,这正是您所需要的。
使用 apply 和 lambda 函数,我们可以创建一个新系列,计算每一行的每个开始日期和当前日期之间的工作日。
projects_df['start_date'] = pd.to_datetime(projects_df['start_date'])
projects_df['current_date'] = pd.to_datetime(projects_df['current_date'])
projects_df['days_count'] = projects_df.apply(lambda row: len(pd.bdate_range(row['start_date'], row['current_date'])), axis=1)
使用 10 个日期对的随机样本,我的输出如下:
start_date current_date bdays
0 2022-01-03 17:08:04 2022-05-20 00:53:46 100
1 2022-04-18 09:43:02 2022-06-10 16:56:16 40
2 2022-09-01 12:02:34 2022-09-25 14:59:29 17
3 2022-04-02 14:24:12 2022-04-24 21:05:55 15
4 2022-01-31 02:15:46 2022-07-02 16:16:02 110
5 2022-08-02 22:05:15 2022-08-17 17:25:10 12
6 2022-03-06 05:30:20 2022-07-04 08:43:00 86
7 2022-01-15 17:01:33 2022-08-09 21:48:41 147
8 2022-06-04 14:47:53 2022-12-12 18:05:58 136
9 2022-02-16 11:52:03 2022-10-18 01:30:58 175