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