所以,这是我的数据框架。
PatientNumber QT Answer Answerdate DiagnosisDate
1 1 transferring No 2017-03-03 2018-05-03
2 1 preparing food No 2017-03-03 2018-05-03
3 1 medications Yes 2017-03-03 2018-05-03
4 2 transferring No 2011-05-10 2012-05-04
5 2 preparing food No 2011-05-10 2012-05-04
6 2 medications No 2011-05-10 2012-05-04
7 2 transferring Yes 2011-15-03 2012-05-04
8 2 preparing food Yes 2011-15-03 2012-05-04
9 2 medications No 2011-15-03 2012-05-04
10 2 transferring Yes 2010-15-12 2012-05-04
11 2 preparing food No 2010-15-12 2012-05-04
12 2 medications No 2010-15-12 2012-05-04
13 2 transferring Yes 2009-10-10 2012-05-04
14 2 preparing food No 2009-10-10 2012-05-04
15 2 medications No 2009-10-10 2012-05-04
16 3 medications No 2008-10-10 2010-07-04
我刚发现一条与我的问题here相关的链接,但没有得到任何正确答案。
一些解释: 对于每个patientNumber,诊断日期是唯一的。答案日期是他们填写问题的几次。
但我想做什么:?
我的目标是从DiagnosisDate
every six month
返回,并将其标记为as the first 6 month record
列。在列中我们应该保存六个月(前六个月,第二个,第三个......)。
例如,对于此数据框,DiagnosisDate
的{{1}}为PatientNumber=1
,因此它应该从那个时间2018-05-03
返回。 6 month
为the first 6 month
,因为最大的AnswerDate不属于该日期,因此不会被标记为2017-27-11
。
如果第一个first six month
属于此日期,则会将其标记为answerdate
。
所以此处first 6 month
在PatientNumber=1
列中得到3
,因为当我们从6month
diagnosisdate
返回时,6 month
会失败在answerdate
之后的那段时间。
所以这个数据帧的输出将是:
6 month
对于PatientNumber = 2,它将从PatientNumber QT Answer Answerdate DiagnosisDate 6month
1 1 transferring No 2017-03-03 2018-05-03 3
2 1 preparing food No 2017-03-03 2018-05-03 3
3 1 medications Yes 2017-03-03 2018-05-03 3
4 2 transferring No 2011-05-10 2012-05-04 1
5 2 preparing food No 2011-05-10 2012-05-04 1
6 2 medications No 2011-05-10 2012-05-04 1
7 2 transferring Yes 2011-15-04 2012-05-04 2
8 2 preparing food Yes 2011-15-04 2012-05-04 2
9 2 medications No 2011-15-04 2012-05-04 2
10 2 transferring Yes 2010-15-12 2012-05-04 3
11 2 preparing food No 2010-15-12 2012-05-04 3
12 2 medications No 2010-15-12 2012-05-04 3
13 2 transferring Yes 2009-10-10 2012-05-04 5
14 2 preparing food No 2009-10-10 2012-05-04 5
15 2 medications No 2009-10-10 2012-05-04 5
16 3 medications No 2008-10-10 2010-07-04 4
开始并返回6个月。它将是DiagnosisDate =2012-05-04
。
我申请了这个:
2011-11-04
首先它只关心月份,所以计算大致不完全, 我找不到提及6个月的数字的方法,就像我在上面的数据框中提到的那样(在6个月中我的意思是1 2,...而不是日期。
因此,根据数据,我们可能会在data['6month'] = pd.date_range(end=data['diagnosisdate'],periods=2, freq='6M',closed='left')
列中看到来自6month
的数字(考虑到诊断前5年)
长篇故事。希望有人能抽出时间:)。
另外,我需要保持整个列的结果不变。
答案 0 :(得分:2)
它并不是你想要的,而是一种能够提供足够好结果的工作。我认为你可以通过计算列DiagnosisDate和Answerdate之间的时差来划分,并除以pd.np.timedelta64(6, 'M')
(将频率更改为6个月)。然后,您需要ceil
函数来获取上面的整数,例如:
data['6month'] = (pd.np.ceil((data['DiagnosisDate']-pd.Timedelta(days=1)-data['Answerdate'])
/pd.np.timedelta64(6, 'M')).astype(int))
忽略负列:
data = data[(data['6month'] >= 0)]
使用您的样本,它会给出:
PatientNumber QT Answer Answerdate DiagnosisDate 6month
1 1 transferring No 2017-03-03 2018-03-05 3
2 1 preparing No 2017-03-03 2018-03-05 3
3 1 medications Yes 2017-03-03 2018-03-05 3
4 2 transferring No 2011-10-05 2012-04-05 1
5 2 preparing No 2011-10-05 2012-04-05 1
6 2 medications No 2011-10-05 2012-04-05 1
7 2 transferring Yes 2011-03-15 2012-04-05 3
8 2 preparing Yes 2011-03-15 2012-04-05 3
9 2 medications No 2011-03-15 2012-04-05 3
10 2 transferring Yes 2010-12-15 2012-04-05 3
11 2 preparing No 2010-12-15 2012-04-05 3
12 2 medications No 2010-12-15 2012-04-05 3
13 2 transferring Yes 2009-10-10 2012-04-05 5
14 2 preparing No 2009-10-10 2012-04-05 5
15 2 medications No 2009-10-10 2012-04-05 5
16 3 medications No 2008-10-10 2010-04-07 3
此外,我不会使用pd.date_range
,因为它似乎没有像你想要的那样行事,但我可能错了。
编辑:要删除DiagnosisDate在答案日期之前的情况,一旦你创建了6个月的专栏,只需执行data = data[data['6months'] > 0]
,因为在这种情况下该值将为负数或零