![](/img/trans.png)
[英]Checking a condition for the Dataframe within 2 years time in Python
[英]Checking for a condition within a timeframe period in a dataframe. [Python] [Pandas]
所以我有一个数据框,并且我正在尝试检查是否:
如果在特定时间(时间戳)与犯罪者和受害者有亲戚关系,则是否发生相反的情况,并且受害者在特定时间范围内成为犯罪者,反之亦然。
例如, if X attacks Y at time Z
那么如果Y
在一个时间范围( Z + 24hrs
)内攻击X
则添加一个计数
X Perpetrator Victim Time Stamp
44 3 FvdP Jmallios 2002-11-13 21:53:17
45 2 FvdP FvdP 2002-11-13 21:58:59
46 28 Lir Lir 2002-11-19 00:47:05
47 16 194.117.133.118 Tinulim 2002-11-27 00:13:40
48 15 Tinulim 194.117.133.118 2002-11-27 00:16:03
49 14 Zocky Tinulim 2002-11-27 00:23:28
50 13 194.117.133.118 Zocky 2002-11-27 00:25:31
这是数据帧的一部分。 一个示例是用户194.117.133.118
攻击用户Tinulim
,然后用户3分钟后又向后攻击194.117.133.118
。 [时间戳记条目是datetime.Timestamp
时间。时间戳记格式的对象]
我想将用户和计数都添加到新数据框中。 例如
Initiator Retort Time Stamp
1 194.117.133.118 Tinulim 2002-11-27 00:13:40
我目前正在使用带循环的for循环,但无法使用此函数正确格式化它:
def time_window_24(time1,time2):
"Is time2 within 24 hours ahead of time1?"
if (time2 - time1).days == 0 and time1!=time2:
return True
else:
return False
这是一个似乎可以使用pd.merge_asof
起作用的解决方案,您可以在此处查看API: merge_asof docs
data = """
perpetrator,victim,date
FvdP,Jmallios,2002-11-13 21:53:17
FvdP,FvdP,2002-11-13 21:58:59
Lir,Lir,2002-11-19 00:47:05
194.117.133.118,Tinulim,2002-11-27 00:13:40
Tinulim,194.117.133.118,2002-11-27 00:16:03
Zocky,Tinulim,2002-11-27 00:23:28
194.117.133.118,Zocky,2002-11-27 00:25:31
"""
from io import StringIO
df = pd.read_csv(StringIO(data), parse_dates=[2])
df = df.query('perpetrator != victim')
merged = pd.merge_asof(df,
df,
on=['date'],
right_by=['perpetrator', 'victim'],
left_by=['victim', 'perpetrator'],
direction='forward',
tolerance=pd.tslib.Timedelta('1 day'),
suffixes=('', '_res'))
merged = merged.rename(columns={'victim_res': 'initiator',
'perpetrator_res': 'retort'})
print(merged[merged.retort.notnull()][['initiator', 'retort', 'date']].to_string())
initiator retort date 1 194.117.133.118 Tinulim 2002-11-27 00:13:40
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.