Python 3.x 以日期为单位计算日龄可用性实际日期出生-否则考虑暂定DOB列-熊猫

Python 3.x 以日期为单位计算日龄可用性实际日期出生-否则考虑暂定DOB列-熊猫,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我有如下所示的df df: 关于df: 实际出生日期-实际出生日期 暂定出生日期-暂定出生日期-如果没有确切的出生日期-只有出生年份-则假定出生日期为出生年份的1月1日 根据上面的内容,我想根据下面解释的条件计算一个名为age_in_days的列 步骤: 1. If Actual_DOB is available (not an NaT) age_in_days是从实际DOB到2021-03-31的天数 df['Actual_DOB'],df['Tentative_DOB'], df['age

我有如下所示的df

df:

关于df:

实际出生日期-实际出生日期

暂定出生日期-暂定出生日期-如果没有确切的出生日期-只有出生年份-则假定出生日期为出生年份的1月1日

根据上面的内容,我想根据下面解释的条件计算一个名为age_in_days的列

步骤:

1. If Actual_DOB is available (not an NaT)
age_in_days是从实际DOB到2021-03-31的天数

df['Actual_DOB'],df['Tentative_DOB'], df['age_in_days']=pd.to_datetime(df['Actual_DOB']),pd.to_datetime(df['Tentative_DOB']),pd.Timestamp('2021-03-31')
age_in_days是从暂定日期到2021-03-31的天数

df['Actual_DOB'],df['Tentative_DOB'], df['age_in_days']=pd.to_datetime(df['Actual_DOB']),pd.to_datetime(df['Tentative_DOB']),pd.Timestamp('2021-03-31')
我尝试了以下代码:

df['Actual_DOB'] = pd.to_datetime(df.Actual_DOB)
df['Tentative_DOB'] = pd.to_datetime(df.Tentative_DOB)
df['age_in_days1'] = (pd.Timestamp('2021-03-31') - df.Actual_DOB).dt.days
df['age_in_days2'] = (pd.Timestamp('2021-03-31') - df.Tentative_DOB).dt.days
预期产出:

ID       Actual_DOB      Tentative_DOB    age_in_days
1        NaN             2002-01-01       7029
2        2020-06-23      2020-01-01       281
3        NaT             NaT              NaN
4        2018-06-29      NaT              1006  

使用np.selectcondition\u列表、结果列表

res=[df['age_in_days']-df.Actual_DOB,df['age_in_days']-df.Tentative_DOB]
将日期强制为datetime,并用2021-03-31追加tcolumn

df['Actual_DOB'],df['Tentative_DOB'], df['age_in_days']=pd.to_datetime(df['Actual_DOB']),pd.to_datetime(df['Tentative_DOB']),pd.Timestamp('2021-03-31')
条件列表

cond=[df.Actual_DOB.notna(),df.Tentative_DOB.notna()]
成绩表

res=[df['age_in_days']-df.Actual_DOB,df['age_in_days']-df.Tentative_DOB]
np.在哪里

df['age_in_days']=np.select(cond,res, np.nan)/ np.timedelta64(1, 'D')

使用np.selectcondition\u列表、结果列表

res=[df['age_in_days']-df.Actual_DOB,df['age_in_days']-df.Tentative_DOB]
将日期强制为datetime,并用2021-03-31追加tcolumn

df['Actual_DOB'],df['Tentative_DOB'], df['age_in_days']=pd.to_datetime(df['Actual_DOB']),pd.to_datetime(df['Tentative_DOB']),pd.Timestamp('2021-03-31')
条件列表

cond=[df.Actual_DOB.notna(),df.Tentative_DOB.notna()]
成绩表

res=[df['age_in_days']-df.Actual_DOB,df['age_in_days']-df.Tentative_DOB]
np.在哪里

df['age_in_days']=np.select(cond,res, np.nan)/ np.timedelta64(1, 'D')

有了你们展示的样品,你们能试一下下面的吗。在这里与函数一起使用。简单的解释是,创建一个日期变量,在这个变量中,我们在Actuak_DOB列中填充关于暂定_DOB列的NaN值。然后使用pd.to.datetime函数确保时间格式正确。最后,用OP给出的2021-03-31日期减去日期变量值,并将其转换为天,生成一个新的DataFrame列

date = df['Actual_DOB'].fillna(df['Tentative_DOB'])
date  = pd.to_datetime(date,yearfirst=True)
df['age_in_days'] = (pd.Timestamp('2021-03-31')-date).dt.days
数据帧的输出如下:

   ID  Actual_DOB Tentative_DOB  age_in_days
0   1         NaN    2002-01-01       7029.0
1   2  2020-06-23    2020-01-01        281.0
2   3         NaN           NaN          NaN
3   4  2018-06-29           NaN       1006.0

有了你们展示的样品,你们能试一下下面的吗。在这里与函数一起使用。简单的解释是,创建一个日期变量,在这个变量中,我们在Actuak_DOB列中填充关于暂定_DOB列的NaN值。然后使用pd.to.datetime函数确保时间格式正确。最后,用OP给出的2021-03-31日期减去日期变量值,并将其转换为天,生成一个新的DataFrame列

date = df['Actual_DOB'].fillna(df['Tentative_DOB'])
date  = pd.to_datetime(date,yearfirst=True)
df['age_in_days'] = (pd.Timestamp('2021-03-31')-date).dt.days
数据帧的输出如下:

   ID  Actual_DOB Tentative_DOB  age_in_days
0   1         NaN    2002-01-01       7029.0
1   2  2020-06-23    2020-01-01        281.0
2   3         NaN           NaN          NaN
3   4  2018-06-29           NaN       1006.0