【问题标题】:Calculate days between two dates given specific values计算给定特定值的两个日期之间的天数
【发布时间】:2019-12-21 17:31:51
【问题描述】:

我有一个数据框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 上找不到任何关于此的内容,并且不知道如何开始。

【问题讨论】:

  • 哪两个日期的区别..?
  • @MarkWang 满足上述三个条件的日期的差异。当Yes 为1 时,计算Value 为非零时(05.01.2017)和Yes 为1 时(即02.01.2017)之间的日期。结果是第 3 行中 UserId 的三天。

标签: python pandas datetime time


【解决方案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)

这将产生相同的结果。

【讨论】:

  • 在尝试您的建议时出现错误 AttributeError: 'Series' object has no attribute 'explode'。我找不到有关函数explode 的任何信息。能详细点吗?
  • @Mataunited18 我更新了答案,pd.Series.explode 只在pandas 版本0.25 中引入,要么你更新,要么你可以使用我更新的解决方案。
  • 感谢它对我的示例有效。但是,对于我的真实数据集,我收到“IndexError:单个位置索引器超出范围”的错误,这意味着 iloc[0]] 查找不存在的内容。你知道我的问题的解决方案吗?
  • @Mataunited18 我更新了答案来解决你的问题,但是,你不应该用更多问题来扩展问题的范围,你应该问一个新问题,例如,如何检测 @ 987654335@掩码返回空值,请查看以下link
  • @Mataunited18 如果回答符合您的要求,请考虑接受。
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多