大熊猫每月六个月的日期范围

时间:2018-06-14 16:36:09

标签: pandas dataframe group-by time-series data-analysis

所以,这是我的数据框架。

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 monththe first 6 month,因为最大的AnswerDate不属于该日期,因此不会被标记为2017-27-11。 如果第一个first six month属于此日期,则会将其标记为answerdate

所以此处first 6 monthPatientNumber=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年)

长篇故事。希望有人能抽出时间:)。

另外,我需要保持整个列的结果不变。

1 个答案:

答案 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],因为在这种情况下该值将为负数或零