当前位置: 首页 > 知识库问答 >
问题:

如何知道记录是否已更新其日期

宗啸
2023-03-14

我想知道记录是否更新了熊猫数据框中的日期。数据框由几列组成,其中对于A的每个值,我们有几个B的值,包括开始日期和结束日期。由于时间戳,我们可以知道是否有新的记录或以前的记录已被修改。

我想知道的是如何能够检查如果一个新记录有一个日期范围接近其他记录在其组中例如B1组如果他们有一个类似的日期范围删除前一个只留下新记录已更新,但如果它没有公共范围来解释为新记录。

例如

输入数据帧:

预期输出:

谢谢你!

共有1个答案

郤仰岳
2023-03-14

我不确定你的“接近”日期范围到底是什么意思,所以这个答案与你在问题中列出的输出不完全匹配。

出于演示目的,我制作了一个名为data.csv的csv文件,其中包含了您问题中的数据

A,B,Start,End,Timestamp
A1,B1,2021-05-10 00:00:00,2021-05-27 00:00:00,2021-05-15 00:00:00
A1,B1,2021-05-12 00:00:00,2021-05-30 00:00:00,2021-04-15 00:00:00
A1,B1,2021-05-10 00:00:00,2021-05-12 00:00:00,2021-03-15 00:00:00
A1,B2,2021-06-02 00:00:00,2021-06-04 00:00:00,2021-02-15 00:00:00
A2,B3,2021-01-01 00:00:00,2022-01-01 00:00:00,2021-05-15 00:00:00
A2,B3,2021-07-15 00:00:00,2021-08-15 00:00:00,2021-04-15 00:00:00
A2,B4,2021-05-30 00:00:00,2021-06-15 00:00:00,2021-05-15 00:00:00
A2,B4,2021-06-02 00:00:00,2021-06-17 00:00:00,2021-04-15 00:00:00

一种方法是比较B列中各组的时间差异。我们将从您在问题中提到的一组开始,即B列值等于“B1”

import pandas as pd

df = pd.read_csv("data.csv")

dff = df[df["B"] == "B1"]

>>> dff
    A   B  ...                  End            Timestamp
0  A1  B1  ...  2021-05-27 00:00:00  2021-05-15 00:00:00
1  A1  B1  ...  2021-05-30 00:00:00  2021-04-15 00:00:00
2  A1  B1  ...  2021-05-12 00:00:00  2021-03-15 00:00:00

# Difference in number of days between start and end date
>>> (pd.to_datetime(dff.End) - pd.to_datetime(dff.Start)).dt.days
0    17
1    18
2     2
dtype: int64

# How does each time difference compare to the time difference in the first row
>>> (pd.to_datetime(dff.End) - pd.to_datetime(dff.Start)).dt.days.diff().fillna(0)
0     0.0
1     1.0
2   -16.0
dtype: float64

# Filter where the number of days difference compared to the first row is less than 7 
>>> abs((pd.to_datetime(dff.End) - pd.to_datetime(dff.Start)).dt.days.diff().fillna(0)) < 7
0     True
1     True
2    False
dtype: bool

# Filter dff based on earlier condition
>>> dff[abs((pd.to_datetime(dff.End) - pd.to_datetime(dff.Start)).dt.days.diff().fillna(0)) < 7]
    A   B                Start                  End            Timestamp
0  A1  B1  2021-05-10 00:00:00  2021-05-27 00:00:00  2021-05-15 00:00:00
1  A1  B1  2021-05-12 00:00:00  2021-05-30 00:00:00  2021-04-15 00:00:00

上面我们只比较了一组B列。要执行上面为所有组所做的操作,我们可以在B列中使用Groupby。然后我们可以迭代每个组,并使用前面提到的过滤器过滤每个组。过滤所有组后,这些过滤后的组可以包含在列表中并连接在一起。

df = pd.concat([
    group[
        abs(
            (pd.to_datetime(group.End) - pd.to_datetime(group.Start))
            .dt.days.diff()
            .fillna(0)
        )
        < 7
    ]
    for name, group in df.groupby("B")
])

>>> df
    A   B                Start                  End            Timestamp
0  A1  B1  2021-05-10 00:00:00  2021-05-27 00:00:00  2021-05-15 00:00:00
1  A1  B1  2021-05-12 00:00:00  2021-05-30 00:00:00  2021-04-15 00:00:00
3  A1  B2  2021-06-02 00:00:00  2021-06-04 00:00:00  2021-02-15 00:00:00
4  A2  B3  2021-01-01 00:00:00  2022-01-01 00:00:00  2021-05-15 00:00:00
6  A2  B4  2021-05-30 00:00:00  2021-06-15 00:00:00  2021-05-15 00:00:00
7  A2  B4  2021-06-02 00:00:00  2021-06-17 00:00:00  2021-04-15 00:00:00

根据你的需要调整亲近程度。我在这里用了几天作为衡量标准,但你可以用不同的。你可以用秒,微秒,纳秒,等等...查看Series留档以获取更多示例

 类似资料:
  • 问题内容: 我有一个名为的方法的对象,该方法启动三个线程。 每个线程执行完毕后,如何获得通知? 有没有办法知道一个(或全部)线程是否已完成或仍在执行? 问题答案: 你可以通过多种方式执行此操作: 在主线程中使用以阻塞方式等待每个线程完成,或者 以轮询方式(通常不鼓励使用)检查,等待每个线程完成,或者 非常规的,对于每个有问题的线程,调用来调用对象中的方法,并对每个线程进行编程以在完成时抛出未捕获的

  • 我在laravel 5中工作,我有一个模块,用户可以在其中更新学生的信息,因为用户有一个带有当前数据的预加载表单,并且可以修改他想要的字段。然后,在控制器中,我执行以下操作: 那工作得很好。所以我的问题是:有一种方法可以获得已经更新的字段的名称?

  • 我想知道在spring Kafka中,当设置为时,commit是如何工作的。 下面是我在ContainerProperties.SetackMode(AbstractMessageListenerContainer.ackMode.Manual)中设置的属性; 代码 我正在按照spring kafka文档执行操作,但这只意味着我的消息被标记为已发送但未消费(这是我的理解)。 > 在这种情况下,我是

  • 问题内容: 如果我在Java(Android)中有两个日期(日期1和日期2),如何知道日期2是否在日期1的同一天内?(注意:如果Date2-Date1 <24小时则不是)。一些示例(支持相同的月份和年份) 谢谢 问题答案: 你为什么不使用? 您可以直接调用isSameDay之类的方法 检查Apache DateUtils。

  • 问题内容: 我不确定是否已经使用cmd:docker login在cmd行中登录了Docker注册表。如何在不尝试推送的情况下测试或查看是否已登录? 问题答案: 编辑2020 再次提到( 已关闭的 )github问题,指出那里没有实际的会话或状态。 docker login实际上并没有创建任何持久性会话,它只是将用户的凭据存储在磁盘上,以便在需要身份验证时可以读取它们以登录 正如其他人指出的那样,

  • 我在Unity中有项目,使用Mapbox, Mapbox包含以下支持库:support-v4-25.1.0.aar 此库以.aar文件的形式提供,而不是作为gradle命令 尝试构建项目时,我收到此错误: 无法确定任务的依赖项:启动程序:lintVitalRelease。< br >无法解析配置的所有项目:launcher:debuguntimeclass path。< br >无法转换支持-v4