我正在使用如下所示的数据框.在有2列,我想找出真正的时间重叠的values_1列为基础的行.values_1列有多个重复项,因此我只想提取Values_1列中特定值的开始日期_时间和结束日期_时间(两者都是日期时间)重叠的行.

下面是我拥有的数据框:

values_1 uniqId DeptId Start DateTime End DateTime
VGM 1278 BKNG 2023-09-05 18:35:28 2023-09-05 20:05:28
VGM 1259 BKNG 2023-09-05 18:55:18 2023-09-05 19:25:38
VGM 2567 BKNG 2023-09-05 14:29:38 2023-09-05 17:35:28
WEH 9854 ASKG 2023-09-05 13:45:58 2023-09-05 15:00:00
WEH 9124 ASKG 2023-09-05 17:25:28 2023-09-05 19:43:13
WEH 9785 ASKG 2023-09-05 16:15:21 2023-09-05 18:24:02
POH 3479 ASKG 2023-09-05 15:35:29 2023-09-05 17:25:22
POH 3449 ASKG 2023-09-05 17:35:28 2023-09-05 18:35:19

我想要实现的输出表是:

values_1 uniqId DeptId Start DateTime End DateTime
VGM 1278 BKNG 2023-09-05 18:35:28 2023-09-05 20:05:28
VGM 1259 BKNG 2023-09-05 18:55:18 2023-09-05 19:25:38
WEH 9124 ASKG 2023-09-05 17:25:28 2023-09-05 19:43:13
WEH 9785 ASKG 2023-09-05 16:15:21 2023-09-05 18:24:02

因此,从上面的输出表中,POH被完全删除,因为没有时间重叠.与VGM和WH一起,两行被删除,因为它们的时间与values_1个项目中的时间不重叠.

有没有人能帮我一下?

先谢谢你.

我看了不同的重叠时间段的例子,但没有运气可以应用到我的数据框中.

谢谢!

推荐答案

您可以对时间进行排序,然后使用groupby.shift比较boolean indexing的连续行:

# ensure datetime
df[['Start DateTime', 'End DateTime']] = df[['Start DateTime', 'End DateTime']].apply(pd.to_datetime)

# sort values
tmp = df.sort_values(by=['values_1', 'Start DateTime', 'End DateTime'])

# are consecutive intervals overlapping?
m = tmp['Start DateTime'].lt(tmp.groupby('values_1')['End DateTime'].shift())

# flag rows and previous ones
out = df.loc[m|m.groupby(tmp['values_1']).shift(-1)]

输出:

  values_1  uniqId DeptId      Start DateTime        End DateTime
0      VGM    1278   BKNG 2023-09-05 18:35:28 2023-09-05 20:05:28
1      VGM    1259   BKNG 2023-09-05 18:55:18 2023-09-05 19:25:38
4      WEH    9124   ASKG 2023-09-05 17:25:28 2023-09-05 19:43:13
5      WEH    9785   ASKG 2023-09-05 16:15:21 2023-09-05 18:24:02

中间体:

  values_1  uniqId DeptId      Start DateTime        End DateTime           end_shift      m m_shift  m|m_shift
6      POH    3479   ASKG 2023-09-05 15:35:29 2023-09-05 17:25:22                 NaT  False   False      False
7      POH    3449   ASKG 2023-09-05 17:35:28 2023-09-05 18:35:19 2023-09-05 17:25:22  False     NaN      False
2      VGM    2567   BKNG 2023-09-05 14:29:38 2023-09-05 17:35:28                 NaT  False   False      False
0      VGM    1278   BKNG 2023-09-05 18:35:28 2023-09-05 20:05:28 2023-09-05 17:35:28  False    True       True
1      VGM    1259   BKNG 2023-09-05 18:55:18 2023-09-05 19:25:38 2023-09-05 20:05:28   True     NaN       True
3      WEH    9854   ASKG 2023-09-05 13:45:58 2023-09-05 15:00:00                 NaT  False   False      False
5      WEH    9785   ASKG 2023-09-05 16:15:21 2023-09-05 18:24:02 2023-09-05 15:00:00  False    True       True
4      WEH    9124   ASKG 2023-09-05 17:25:28 2023-09-05 19:43:13 2023-09-05 18:24:02   True     NaN       True

Python相关问答推荐

使用polars .滤镜进行切片速度比pandas .loc慢

将整组数组拆分为最小值与最大值之和的子数组

为什么我的Python代码在if-else声明中的行之前执行if-else声明中的行?

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

未删除映射表的行

如何记录脚本输出

管道冻结和管道卸载

使用setuptools pyproject.toml和自定义目录树构建PyPi包

OR—Tools CP SAT条件约束

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

在极点中读取、扫描和接收有什么不同?

如何将泛型类类型与函数返回类型结合使用?

需要帮助使用Python中的Google的People API更新联系人的多个字段'

Django在一个不是ForeignKey的字段上加入'

Seaborn散点图使用多个不同的标记而不是点

如何根据一定条件生成段id

用由数据帧的相应元素形成的列表的函数来替换列的行中的值

为什么我的scipy.optimize.minimize(method=";newton-cg";)函数停留在局部最大值上?

根据过滤后的牛郎星图表中的数据计算新系列

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?