【问题标题】:Checking for a condition within a timeframe period in a dataframe. [Python] [Pandas]检查数据帧中某个时间段内的条件。 [蟒蛇] [熊猫]
【发布时间】:2017-12-21 09:17:50
【问题描述】:

所以我有一个数据框,我正在尝试检查是否:

如果犯罪者和受害者在某个时间(时间戳)有关系,则在特定时间范围内是否发生相反的情况,受害者是否成为犯罪者,反之亦然。

例如if X attacks Y at time Z 然后添加计数如果Y 在时间范围内攻击X (Z + 24hrs)

        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  

我目前正在使用带有 iterrows 的 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

【问题讨论】:

  • 欢迎来到StackOverflow,请提供MVCE
  • 请为您提供的示例输入提供预期输出,
  • @jo9k 给出了示例数据帧的预期输出,抱歉

标签: python pandas datetime dataframe


【解决方案1】:

这是一个似乎可以使用 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

【讨论】:

  • 完美,之前从未听说过merge_asof,所以会看看。谢谢!
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 2021-11-09
  • 2022-01-10
  • 2013-10-19
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多