Python 基于不同类型的值派生日期列

Python 基于不同类型的值派生日期列,python,pandas,list,dataframe,python-datetime,Python,Pandas,List,Dataframe,Python Datetime,我有一个如下所示的数据帧 df = pd.DataFrame({'subject_id' :[1,2,3,4,5], 'date_of_interview':['2007-05-27','2008-03-13','2010-11-19','2011-10-05','2004-11-02'], 'Age':[31,35,78,72,43], 'value'

我有一个如下所示的数据帧

df = pd.DataFrame({'subject_id' :[1,2,3,4,5],
                        'date_of_interview':['2007-05-27','2008-03-13','2010-11-19','2011-10-05','2004-11-02'],
                        'Age':[31,35,78,72,43],
                        'value':[6,0.33,1990,np.nan,2001],
                        'age_detected':[25,35,98,65,40]})
df['date_of_interview'] = pd.to_datetime(df['date_of_interview'])
我想根据
value
age\u-detected
列创建一个名为
dis\u-date
的新列

例:受试者id=1的访谈日期为2007-05-27。如果我们看一下他的价值栏,我们可以看到他的价值是6,这意味着我们必须从采访日期减去6年,才能将
2001-05-27
作为dis\u日期

然而,如果你看主体id=3,他在值列中有一个年份值,所以他的dis_日期将是
1990-11-19

当值列中有
NA
时,我们必须查看他的
age\u detected
列,并从
age
中减去它以获得年数

例:受试者id=4的
年龄
为72岁,检测到
年龄
为65岁。现在差是7,他的离店日期将是
2004-10-05


如果少于6位代表年份数,请注意“值”列中的值。如果是1,就意味着减去1年。如果它是0.33,意味着减去4个月。1年=12个月。0.33=3.96个月(4个月)

我试过这样的方法,但没用

for i in range(len(df['value'])):

    if (len(str(df['value'][i]))) < 6:
        df['dis_date'] = df['date_of_interview'] - pd.DateOffset(years=df['value'][i]) 
范围内i的
(len(df['value']):
如果(len(str(df['value'][i]))<6:
df['dis_date']=df['date_of_session']-pd.DateOffset(年份=df['value'][i])
我希望我的输出如下所示

df = pd.DataFrame({'subject_id' :[1,2,3,4,5],
                        'date_of_interview':['2007-05-27','2008-03-13','2010-11-19','2011-10-05','2004-11-02'],
                        'Age':[31,35,78,72,43],
                        'value':[6,0.33,1990,np.nan,2001],
                        'age_detected':[25,35,98,65,40]})
df['date_of_interview'] = pd.to_datetime(df['date_of_interview'])

在该解决方案中,为验证替换年份或减去月份创建了辅助列:

#if value less like 1 multiple by 12, another values set to NaNs
df['m1'] = np.where(df['value'].lt(1), df['value'].mul(12).round(), np.nan)
#if values more like 1000 it is year
df['y1'] = df['value'].where(df['value'].gt(1000))

#if values between 1, 1000 is necessary subtract years from value column
y1 = df['Age'].sub(df['age_detected'])
df['y2'] = np.where(y1.between(1, 1000), df['date_of_interview'].dt.year.sub(y1), np.nan)
#joined years to one column
df['y'] = df['y1'].fillna(df['y2'])

#replaced years by another column
f1 = lambda x: x['date_of_interview'] - pd.DateOffset(year=(int(x['y'])))
df['dis_date1'] = df.dropna(subset=['date_of_interview','y']).apply(f1, axis=1)
#subtracted months if non missing values
f1 = lambda x: x['date_of_interview'] - pd.DateOffset(months=(int(x['m1'])))
df['dis_date2'] = df.dropna(subset=['m1']).apply(f1, axis=1)

#join together
df['dis_date'] = df['dis_date1'].fillna(df['dis_date2'])
print (df)
   subject_id date_of_interview  Age    value  age_detected   m1      y1  \
0           1        2007-05-27   31     6.00            25  NaN     NaN   
1           2        2008-03-13   35     0.33            35  4.0     NaN   
2           3        2010-11-19   78  1990.00            98  NaN  1990.0   
3           4        2011-10-05   72      NaN            65  NaN     NaN   
4           5        2004-11-02   43  2001.00            40  NaN  2001.0   

       y2       y  dis_date1  dis_date2   dis_date  
0  2001.0  2001.0 2001-05-27        NaT 2001-05-27  
1     NaN     NaN        NaT 2007-11-13 2007-11-13  
2     NaN  1990.0 1990-11-19        NaT 1990-11-19  
3  2004.0  2004.0 2004-10-05        NaT 2004-10-05  
4  2001.0  2001.0 2001-11-02        NaT 2001-11-02  

您如何定义
0.33
年<代码>12/4
?1年=12个月。0.33=3.96个月(4个月)我今晚到家时会看看这个。当然。那真的很有帮助。谢谢。
2007-12-13
正确吗?因为如果减去4个月得到
2007-11-13