给定特定值,计算两个日期之间的天数

时间:2019-08-15 08:28:30

标签: python pandas datetime time

我有一个数据框df1,我想计算在给定三个条件的情况下两个日期之间的天数,并创建一个新的列DiffDays,其天数相差。

1)当Yes1

2)当Value中的值非零时

3)必须特定于UserId(也许与groupby()一样)

df1 = pd.DataFrame({'Date':['02.01.2017', '03.01.2017', '04.01.2017', '05.01.2017', '01.01.2017', '02.01.2017', '03.01.2017'],
                   'UserId':[1,1,1,1,2,2,2],
                   'Value':[0,0,0,100,0,1000,0],
                   'Yes':[1,0,0,0,1,0,0]})

例如,当Yes为1时,计算Value为非零值(即05.01.2017)和Yes为1时(02.01.2017)之间的日期。结果是第3行的UserId为三天。

预期结果:

        Date    UserId  Value   Yes  DiffDays
0   02.01.2017  1        0.0    1    0
1   03.01.2017  1        0.0    0.0  0
2   04.01.2017  1        0.0    0.0  0
3   05.01.2017  1        100    0.0  3
4   01.01.2017  2        0.0    1    0
5   02.01.2017  2        1000   0.0  1
6   03.01.2017  2        0.0    0.0  0

我在Stackoverflow上找不到任何与此相关的内容,并且不确定如何开始。

1 个答案:

答案 0 :(得分:1)

def dayDiff(groupby):
    if (not (groupby.Yes == 1).any()) or (not (groupby.Value > 0).any()):
        return np.zeros(groupby.Date.count())

    min_date = groupby[groupby.Yes == 1].Date.iloc[0]    
    max_date = groupby[groupby.Value > 0].Date.iloc[0]
    delta = max_date - min_date
    return np.where(groupby.Value > 0 , delta.days, 0)


df1.Date = pd.to_datetime(df1.Date, dayfirst=True)
DateDiff = df1.groupby('UserId').apply(dayDiff).explode().rename('DateDiff').reset_index(drop=True)
pd.concat([df1, DateDiff], axis=1)

返回:


Date    UserId  Value     Yes       DateDiff
0   2017-01-02  1   0      1          0
1   2017-01-03  1   0      0          0
2   2017-01-04  1   0      0          0
3   2017-01-05  1   100    0          3
4   2017-01-01  2   0      1          0
5   2017-01-02  2   1000   0          1
6   2017-01-03  2   0      0          0

尽管这回答了您的问题,但日期diff逻辑很难遵循,尤其是涉及DateDiff值的位置时。

更新

pd.Series.explode()仅在pandas版本0.25中引入,适用于以前的版本:

df1.Date = pd.to_datetime(df1.Date, dayfirst=True)
DateDiff = (df1
            .groupby('UserId')
            .apply(dayDiff)
            .to_frame()
            .explode(0)
            .reset_index(drop=True)
            .rename(columns={0: 'DateDiff'}))
pd.concat([df1, DateDiff], axis=1)

这将产生相同的结果。