python-3.x - Pandas 派生列表示两个日期之间的工作日数
问题描述
numpybusdays_count
可以工作,但是当我将它应用到数据框时,我会收到错误,因为某些日期是 NaT(正确)。
如果它是一个普通数组,我可以迭代每一行,检查是否为 NaT,然后应用公式,但在这里不确定......
data_raw['due'] = pd.to_datetime(data_raw['Due Date'], format="%Y%m%d")
data_raw['clo'] = pd.to_datetime(data_raw['Closed Date'], format="%Y%m%d")
data_raw['perf'] = data_raw.apply(lambda row: np.busday_count(row['due'].values.astype('datetime64[D]'),
row['clo'].values.astype('datetime64[D]')
if pd.isnull(row['clo'])
else '',
axis=1
))
错误是KeyError: 'due'
这在下面有效,但不确定是否加入:
p_df = data_raw[pd.notna(data_raw.clo)]
p_df['perf'] = np.busday_count(p_df['due'].values.astype('datetime64[D]'), p_df['clo'].values.astype('datetime64[D]'))
解决方案
我找到了解决方法,但很确定这不是最好的方法......
# split the dataframe
not_na = data_raw[pd.notna(data_raw.clo)]
is_na = data_raw[pd.isna(data_raw.clo)]
# do the calc without the NaNs
not_na['perf'] =
np.busday_count(not_na['due'].values.astype('datetime64[D]'),
not_na['clo'].values.astype('datetime64[D]'))
# lastly, join the dataframes back
new_df = pd.concat([is_na, not_na], axis=0)
推荐阅读
- javascript - 当 csrf 设置为 auto 时,如何使用带有 codeigniter 4 的 jquery 验证库检查现有数据?
- r - 如何将自由文本条目作为图例添加到 ggplot?
- ssis - 优先约束在SSIS中评估为真(或假)是什么意思
- python - 分解python中的列表理解
- mysql - mySQL 删除唯一键约束
- firebase - 如何以相反的顺序从 Firebase 数据库添加数据?
- d3.js - 将 y 轴水平线添加到 D3 散点图
- swift - 带有扩展部分的 Swift UITableView,在选定的新部分上强制关闭已打开的部分
- list - Swiftui 移除滑动删除功能
- android - 依次运行两个倒数计时器