首页 > 解决方案 > 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]'))

标签: python-3.xnumpyderived-column

解决方案


我找到了解决方法,但很确定这不是最好的方法......

# 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)

推荐阅读