微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python pandas 可以有效地为连续行发现数据帧中的时间差

如何解决Python pandas 可以有效地为连续行发现数据帧中的时间差

我有一个如下的数据框:

   payeeId     amount       createdAt                          TrxnID
    1001        2.30      2021-04-24 01:40:11.156000+00:00     100AA
    1001        35        2021-04-24 02:10:11.146000+00:00     100AB
    1001        600       2021-04-24 02:12:14.309000+00:00     100AC
    1002        100       2021-04-24 02:59:51.127000+00:00     110BD
    1003        1900      2021-04-24 04:09:15.113000+00:00     120AC
    1003        10        2021-04-24 04:19:40.132000+00:00     120AM

我想添加一个具有以下逻辑的标志:

  If for a given 'PayeeId',the difference between two consecutive 'createdAt' is less than 300 seconds,then the flag will be set to 'No Settlement',else 'Approved'

所以结果数据框看起来像

     payeeId    amount       createdAt                          TrxnID    Flag
      1001       2.30      2021-04-24 01:40:11.156000+00:00     100AA    Approved
      1001       35        2021-04-24 02:10:11.146000+00:00     100AB    Approved
      1001       600       2021-04-24 02:12:14.309000+00:00     100AC    Not Approved
      1002       100       2021-04-24 02:59:51.127000+00:00     110BD    Approved
      1003       1900      2021-04-24 04:09:15.113000+00:00     120AC    Approved
      1003       10        2021-04-24 04:19:40.132000+00:00     120AM    Approved

所以我尝试使用以下代码片段:

gs = df.groupby(['payeeId'])['createdAt']
df['Time_Diff'] = gs.diff().fillna(pd.timedelta(seconds=0))/pd.timedelta(seconds=300)
df['Flag'] = np.where(df_sub_count['Time_Diff']>0,'Approved','No Settlement')

但是上面的没有产生想要的结果。我看到 payeeID 1002 的“No Settlement”。这是不可取的。

在这里遗漏了什么。

解决方法

df['createdAt'] = pd.to_datetime(df.createdAt)

diff_sec=300.
mask= df.groupby('payeeId').createdAt.diff().astype('timedelta64[s]').fillna(diff_sec)
df['Flag'] = np.where(mask >= diff_sec,'Approved','Not Approved') # plz replace 'Not Approved' with 'No Settlement' based on requirement.

输出

    payeeId amount  createdAt                     TrxnID    Flag
0   1001    2.3 2021-04-24 01:40:11.156000+00:00    100AA   Approved
1   1001    35.0    2021-04-24 02:10:11.146000+00:00    100AB   Approved
2   1001    600.0   2021-04-24 02:12:14.309000+00:00    100AC   Not Approved
3   1002    100.0   2021-04-24 02:59:51.127000+00:00    110BD   Approved
4   1003    1900.0  2021-04-24 04:09:15.113000+00:00    120AC   Approved
5   1003    10.0    2021-04-24 04:19:40.132000+00:00    120AM   Approved

说明

我们按 payeeId 对 df 进行分组,并在几秒钟内获取 createdAt 之间的差异。
由于我们希望每个 payeeId 的第一次出现都被批准,因此用 300 填充 na。
然后我们使用 np.where 根据条件创建 Flag 列。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?