如何使用Python中的日期更好地删除NaN并确定两个间隔之间的工作日和假期?

问题描述

我有一个带有两个日期字段的数据框,如下所示。我希望能够使用此数据来计算雇员的“调整后的工资”-如果该雇员在每月15日之后加入,他们将在当月10日(发薪日)的3月+ 4月的15天领取工资,同样,如果他们在4月离开,则计算应仅考虑4月的工作天。

Hire_Date  | Leaving_Date
_________________________
01/02/2007 | NaN
02/03/2007 | NaN
23/03/2020 | Nan
01/01/1999 | 04/04/2020

哦,上面的数据不是以datetime格式传递的,leaving_date字段中当然有很多NaN:)

因此,我做了以下事情:

将数据转换为datetime格式,保留日期,并用随机日期填充N / A(对此不太满意,但是仅在一些记录中丢失,因此不担心影响)。

df['Hire_Date'] = pd.to_datetime(df['Hire_Date'])
df['Hire_Date'] = [a.date() for a in df['Hire_Date']]
df['Hire_Date'] = df['Hire_Date'].fillna('1800-01-01')

重复日期。唯一的区别是,鉴于我们没有那么多的离开者,我用0填充了NaN。

    df['Leaving_Date'] = pd.to_datetime(df['Leaving_Date'])
    df['Leaving_Date'] = [a.date() for a in df['Leaving_Date']]
    df['Leaving_Date'] = df['Leaving_Date'].fillna('0')

然后,我最终创建了一个新的专栏来记录工作日,这就是我遇到的问题。我的代码如下。

我确定了雇用月份的第一天,并尝试使用np.where()函数来计算三月份的工作天数。

df['z_First_Day_H_Month'] = df['Hire_Date'].values.astype('datetime64[M]')
df['march_Workdays'] = np.where((df['z_First_Day_H_Month'] >= '2020-03-01'),(np.busday_count(df['z_First_Day_H_Month'],'2020-03-31')),'N/A') 

重复类似的过程,尽管更简单的计算方法是计算出终止月份的工作天数。

df['z_First_Day_T_Month'] = df.apply(lambda x: '2020-04-01').astype('datetime64[M]')
df['T_Mth_Workdays'] = df.apply(lambda x: np.busday_count(x['z_First_Day_T_Month'],x['Leaving_Date'])

但是,以上过程返回以下错误

iterator operand 0 dtype Could not be cast from dtype(' m8 [ns] ') to dtype(' m8 [d] according to rule 'safe' ')

请问我可以得到一些帮助来解决此问题吗?谢谢!

解决方法

我做了一些研究,似乎日期时间格式可能是个问题。 [ns]格式具有纳秒级的精度,并且np.busday_count要求输入日期格式[D],从而导致错误。看看this numpy document并检查“日期时间单位”部分。

Numpy,TypeError: Could not be cast from dtype('<M8[us]') to dtype('<M8[D]')

看看这篇文章。与您的问题完全相同!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...