python - 如何知道记录是否已更新其日期
问题描述
我想知道一条记录是否在熊猫数据框中更新了它的日期。数据框由几列组成,其中对于 A 的每个值,我们有几个 B 的值以及开始日期和结束日期。由于时间戳,我们可以知道是否有新记录或以前的记录已被修改。
我想知道的是如何能够检查一个新记录的日期范围是否接近其组中的其他记录,例如 B1 组,如果它们有相似的日期范围,删除前一个,只留下新的记录已更新,但如果它没有共同的范围来解释为新记录。
例如,
输入数据框:
一种 | 乙 | 开始 | 结尾 | 时间戳 |
---|---|---|---|---|
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 |
预期输出:
一种 | 乙 | 开始 | 结尾 | 时间戳 |
---|---|---|---|---|
A1 | B1 | 2021-05-10 00:00:00 | 2021-05-27 00:00:00 | 2021-05-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 |
谢谢!
解决方案
我不确定您对“接近”日期范围的确切含义,因此此答案与您在问题中列出的输出不完全匹配。
出于演示目的,我制作了一个 csv 文件data.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
列。要对所有组执行上述操作,我们可以groupby
在B
列上使用 a。然后我们可以遍历每个组并使用前面提到的过滤器过滤每个组。过滤所有组后,这些过滤后的组可以包含在列表中并连接在一起。
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
文档以获取更多示例。
推荐阅读
- android - Flutter Firebase 匹配用户数据
- java - 错误:未编组的对象是骆驼 XML 文件中不受支持的类型
- regex - 如何在范围内拆分字符串
- c++ - 将第三方 SDK 集成到我的项目中
- awk - awk 范围需要正确
- flutter - 我希望 valueIndicator 始终在 Flutter 的 RangeSlider 中打开
- c++ - 工具栏中带有 QAction 的 Qt QActionGroup
- vue.js - 在 vue cli 中添加外部 js 文件
- ios - 获取类似于 SceneKit 的 showStatistics 的 SpriteKit 统计信息
- javascript - Node JS 如何在 Node JS 中将 Json 响应转换为 HTML 页面