我有一个如下数据框:
startdate terminationdate
0 1997-07-13 2004-09-29
1 1999-07-26 2016-03-23
2 2003-04-01 NaT
3 2007-06-01 NaT
4 2009-06-01 NaT
我想获得输出以几个月为单位计算保有权。对于终止日期中的空值,我想使用当前日期进行计算。
我尝试了以下代码:
def tenure(df):
if df['terminationdate'] != np.nan:
tenure = (df['terminationdate'] - df['startdate'])/np.timedelta64(1, 'M')
else:
tenure = (datetime.datetime.now() - df['startdate'])/np.timedelta64(1, 'M')
return tenure
上面的代码无法计算NaT值的期限。
答案 0 :(得分:1)
您可以使用fillna
将NaT
中的terminationdate
替换为当前版本:
tenure = (df['terminationdate'].fillna(datetime.datetime.today()) - df['startdate'])/
np.timedelta64(1, 'M')
答案 1 :(得分:0)
尝试使用pd.to_datetime()将列转换为日期
使用np.where和datetime.datetime.now()。date
填充当前日期
最后应用您的差异公式
import pandas as pd
import numpy as np
import datetime
df['startdate'] = pd.to_datetime(df['startdate']).dt.date
df['terminationdate'] = pd.to_datetime(df['terminationdate']).dt.date
df['terminationdate'] = np.where(df['terminationdate'].isnull(),
datetime.datetime.now().date(),
df['terminationdate'])
df['result'] = (df['terminationdate'] - df['startdate'])/np.timedelta64(1, 'M')
答案 2 :(得分:0)
tawab_shakeel的答案有效。如果您想在数据集中保留null并遵循逻辑,则可以对每个原始
使用apply函数from datetime import datetime
import pandas as pd
import numpy as np
df = pd.DataFrame({'startdate': pd.to_datetime(['1997-07-13', '1999-07-26', '2003-04-01', '2007-06-01', '2009-06-01']),
'terminationdate': pd.to_datetime(['2004-09-29', '2016-03-23', None, None, None])})
def tenure(start_date, end_date):
if pd.isna(end_date) == False:
tenure = (end_date - start_date)/np.timedelta64(1, 'M')
else:
tenure = (datetime.now() - start_date)/np.timedelta64(1, 'M')
return tenure
tenure_month = df.apply(lambda row: tenure(row['startdate'], row['terminationdate']), axis = 1)