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

Python 计算给定特定值的两个日期之间的天数,python,pandas,datetime,time,Python,Pandas,Datetime,Time,我有一个数据帧df1,我想在给定三个条件的情况下计算两个日期之间的天数,并创建一个新的DiffDays列,其中的差值以天为单位 是时为1 2当值中的值为非零时 3必须是特定于用户ID的,可能与groupby有关 例如,当“是”为1时,计算值为非零(2017年1月5日)和“是”为1(2017年1月2日)之间的日期。第3行的UserId的结果是三天 预期成果: Date UserId Value Yes DiffDays 0 02.01.2017 1

我有一个数据帧df1,我想在给定三个条件的情况下计算两个日期之间的天数,并创建一个新的DiffDays列,其中的差值以天为单位

是时为1

2当值中的值为非零时

3必须是特定于用户ID的,可能与groupby有关

例如,当“是”为1时,计算值为非零(2017年1月5日)和“是”为1(2017年1月2日)之间的日期。第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上找不到关于这个的任何信息,也不知道如何开始

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
尽管这回答了您的问题,但date diff逻辑很难理解,尤其是在date diff值的位置上

更新

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)

这将产生相同的结果。

两个日期之间的差异。@MarkWang这两个日期之间的差异是指满足上述三个条件的日期。当“是”为1时,计算值为非零(2017年1月5日)和“是”为1(2017年1月2日)之间的日期。第3行的UserId的结果是三天。我得到了错误AttributeError:“Series”对象在尝试您的建议时没有属性“explode”。我找不到有关函数爆炸的任何信息。您能详细说明一下吗?@Mataunited18我更新了答案,pd.Series.explode仅在pandas版本0.25中引入,您可以更新,也可以使用我的更新解决方案解决。感谢它对我的示例起到了作用。但是,我得到了indexer的错误:对于我的实际数据集,单位置索引器是超出范围的,这意味着iloc[0]]查找不存在的内容。你知道我的问题的解决方案吗?@ MatauniDe18我更新了你的答案,但是,你不应该用更多的问题来扩展一个问题的范围,而应该问一个新的问题,例如,如何检测一个DF掩码返回的空值,检查下面的内容。
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)