【问题标题】:Python - Merge data by time intervals (R data.table mimic?)Python - 按时间间隔合并数据(R data.table 模仿?)
【发布时间】:2019-07-25 00:31:37
【问题描述】:

我刚刚学习 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 小时内。

【问题讨论】:

  • 你能给我们看一个数据框的例子吗?我很难想象我们在这里谈论的是什么轴和维度。
  • @NoSplitSherlock 我已编辑添加示例,谢谢 :)
  • @molecularrunner 您仍然对解决此问题感兴趣吗?我想我可以帮你,但我的解决方案不包括最后一条记录,因为它们之间有 23 小时的延时,除非重量日期实际上是 2019 年 4 月 4 日。

标签: python r date time-series data.table


【解决方案1】:

首先您需要将日期保存为日期时间,然后您可以执行类似于您在data.table 中所做的操作,在两个数据帧之间执行连接,然后过滤时差小于两小时的记录.

# 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。我会给这个开始。不过,我不确定这个示例是否会有所帮助,因为在心率之前可能会进行多次体重测量,反之亦然。所以我不一定想只绑定每个数据帧中的相应行。
  • @molecularrunner 随时编辑您问题中的简单数据以解决这些情况。
  • 因此,正如我所解释的,这些案例反映在原始数据中,我试图显示 2019 年 4 月 3 日 23:13 绑定到 2 小时内的 2 个单独的体重测量值。
  • 那么最后一条记录应该是 4/4/2019 00:00 吗?
  • 我很抱歉,您已经向我指出了这一点。我确实尝试过你的解决方案,但后来出现内存错误,我觉得我的数据集没有那么大
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2018-06-18
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多