我有两个数据框,第一个是用户手动创建的,第二个是机器错误。 我想根据第一个数据帧(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/