![](/img/trans.png)
[英]Equivalent of R data.table rolling join in Python and PySpark
[英]Python - Merge data by time intervals (R data.table mimic?)
我只是在学习 python 并且有一个关于按时间集成数据帧的问题。 例如,假设我有 2 个独立的数据帧,它们的时间间隔不规则,但按 study_id 分组。 我想加入相距 2 小时之内的行。
以前,我为此使用了 R 中的 data.table 包。 此代码的示例如下。
df_new <- df1[df2, on="Study_ID", allow.cartesian=T][difftime(`date_df1`, `date_df2`, units="hours") <= 2 & difftime(`date_df1`, `date_df2`, units="hours") >= - 2]
此代码然后绑定每个实例,其中每个数据帧的日期都在 2 小时之内。 我想看看是否有类似的python代码? 理想情况下,我想合并这些行,以便我可以找到在测量之前或之后 2 小时内发生的测量之间发生的最大值。
有什么想法吗? 谢谢!
编辑:数据框示例
ID Date HeartRate
1 4/1/2019 04:13 56
1 4/2/2019 05:30 45
1 4/3/2019 22:10 61
2 4/3/2019 23:13 62
2 4/5/2019 15:10 67
df2
ID Date Weight
1 4/1/2019 06:10 112
1 4/2/2019 02:30 114
1 4/3/2019 21:10 112.5
2 4/3/2019 23:10 113
2 4/4/2019 00:00 114
Output (this is what I would love!)
ID Date(blood pressure) HeartRate Date(weight) Weight
1 4/1/2019 4:13 56 4/1/2019 06:10 112
1 4/3/2019 22:10 61 4/3/2019 21:10 112.5
2 4/3/2019 23:13 62 4/3/2019 23:10 113
2 4/3/2019 23:13 62 4/4/2019 00:00 114
在此示例中,每个日期框架中的第二行刚刚被删除,因为这些测量值在 2 小时内没有一对。 但是 df1 中显示的倒数第二行重复,因为它在 df2 中有 2 个案例在 2 小时内。
首先,您需要将日期另存为datetime,然后可以执行与data.table
类似的data.table
,在两个数据data.table
之间执行data.table
,然后过滤时差小于2个小时的记录。
# store as datetime
df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])
# join dataframes
merged = df1.merge(df2, left_on='ID', right_on='ID',
suffixes=('(blood pressure)', '(weight)'))
# calculate hour difference between the two dates
hour_dif = np.abs(merged['Date(blood pressure)'] - merged['Date(weight)'])/np.timedelta64(1, 'h')
merged[hour_dif < 2]
哪个产量
# ID Date(blood pressure) HeartRate Date(weight) Weight
# 0 1 2019-04-01 04:13:00 56 2019-04-01 06:10:00 112.0
# 8 1 2019-04-03 22:10:00 61 2019-04-03 21:10:00 112.5
# 9 2 2019-04-03 23:13:00 62 2019-04-03 23:10:00 113.0
我要感谢@josemz的出色回答! 它成功了,我的一长串问题是由于我的数据清理错误而出现的问题。 非常感谢您的帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.