问题描述
我有一个带有两个日期字段的数据框,如下所示。我希望能够使用此数据来计算雇员的“调整后的工资”-如果该雇员在每月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]')
看看这篇文章。与您的问题完全相同!