python - 如何根据时间间隔合并两个数据帧并进行转换

标签 python pandas datetime conditional-statements nested-loops

我有两个数据框,第一个是用户手动创建的,第二个是机器错误。 我想根据第一个数据帧(df_a)中的时间间隔合并它们

这是数据框;

d_a = {'Station' : ['A1','A2'],
       'Reason_a' : ['Electronic','Feed'],
       'StartTime_a' : ['2019-01-02 02:00:00','2019-01-02 04:22:00'],
       'EndTime_a' : ['2019-01-02 02:20:00', '2019-01-02 04:45:00']}

d_b = {'Station' : ['A1','A1','A1','A2','A2','A2'],
       'Reason_b' : ['a','n','c','d','e','n'],
       'StartTime_b' : ['2019-01-02 00:00:00.000','2019-01-02 00:05:00.000','2019-01-01 23:55:00.000','2019-01-02 04:19:53.000','2019-01-02 04:19:37.000','2019-01-02 04:23:00.000'],
       'EndTime_b' : ['2019-01-02 00:19:15.000','2019-01-02 00:29:45.000','2019-01-02 00:12:12.000','2019-01-02 04:27:12.000','2019-01-02 04:47:16.000','2019-01-02 04:52:45.000']}

df_a = pd.DataFrame(d_a)
df_b = pd.DataFrame(d_b)

两个数据帧的时间间隔的任何交点被认为是有效记录。

condition1 = df_b start_time 在df_a开始时间之后开始,在df_a结束时间之前结束

condition2 = df_b start_time 在df_a开始时间之前开始但在df_a结束时间之前结束

condition3 = df_b start_time 在 df_a 开始时间和 df_a 结束时间之间开始但在 df_a 结束时间之后结束

最后我想根据条件合并这两个数据框。我理想中的 table 如下所示

 Station     Reason_a        a     n     c     d    e 
  A1         Electronic      1     1     1     0    0
  A2          Feed           0     1     0     1    0

我该如何解决这个问题? 任何评论都会有所帮助。

提前致谢。

最佳答案

我会通过合并 station 上的表并计算交集来解决它 :D

import numpy as np

df = pd.merge(df_a, df_b, on="Station")

# Convert to date
for datevar in ["StartTime_a", "StartTime_b", "EndTime_a", "EndTime_b"]:
    df[datevar] = pd.to_datetime(df[datevar])

# Intersections definition
df["intersection"] = (((df.StartTime_a > df.StartTime_b) & (df.StartTime_a < df.EndTime_b)) |
                      ((df.StartTime_a < df.StartTime_b) & (df.EndTime_a > df.StartTime_b)))

# Filter only intersections
(df[["Station", "Reason_a", "Reason_b", "intersection"]]
.pivot_table(index=["Station", "Reason_a"], columns="Reason_b", aggfunc=np.sum)
.fillna(0).astype(int)) 

关于python - 如何根据时间间隔合并两个数据帧并进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57507802/

相关文章:

javascript - Atom编辑器:用于插入时间戳的代码段

python - 给定两个 n 元组,如何有效地实现/构造以下排列?

Python 情节未显示

python - 如何在保留列的同时找到累积计数行之间的差异

python - pandas 合并命令在并行循环中失败 - "ValueError: buffer source array is read-only"

sql-server - 使用 DateTime2 截断日期和时间

python - 在 python 中对列表使用 if 语句?

python - 使用pyqt进行图像标注

python - Pandas:按两列组合分组

sql-server - 两个日期之间的 SQL 返回时间,不包括周末和非轮类时间