【问题标题】:Merge with the nearest minute using pandas使用熊猫与最近的分钟合并
【发布时间】:2019-07-13 23:42:24
【问题描述】:

我只想在 ±1 分钟的间隔内合并两个数据帧。

这里name_df带有样本数据集:

Name    Date
A       2/19/2019 17:16:15
B       2/19/2019 17:19:46
C       2/19/2019 17:23:03

另一个日期框架job_df:

Job         Datestamp
Engineer    2/19/2019  17:15:56 
Dancer      2/19/2019  17:19:27 
Singer      2/19/2019  17:22:44 

这是我尝试实现的,但此方法错过了 1 分钟另一侧的一些行(例如 30 秒向上舍入):

name_df['Date&Time'] = name_df['Date&Time'].dt.round('1min')
job_df['Date&Time'] = job_df['Date&Time'].dt.round('1min')

merged_df = pd.merge(name_df, job_df, on='Date&Time')

非常感谢您对此的任何帮助!

【问题讨论】:

  • 为上述数据提供预期输出
  • 四舍五入到最接近的分钟意味着 Dancer:job_df 中的 17:19,name_df 中的 17:20。因此,四舍五入到最接近的时间可能是您的解决方案。你为什么不四舍五入?

标签: python pandas dataframe


【解决方案1】:

这是实现您所描述的潜在方法:

  1. 创建一个新的数据框(例如 time_df),其中包含来自 name_df 和 job_df 的日期和时间戳
  2. time_df 升序排序
  3. 在 time_df 中创建一个额外的列,为每组日期和时间戳指定一个唯一的组号,这些日期和时间戳在彼此之间在一分钟内
  4. 通过计算第一个日期和时间戳与之后的日期和时间戳之间的秒数差异来填充此新列,只要差异为 120 秒或更短,就为每个日期和时间戳赋予相同的唯一组编号。
  5. 一旦差值大于 120 秒,增加组号并使用下一个未分组的行重复该过程。
  6. 为所有行分配组号后,将 time_df 合并回日期时间戳列上的 name_df 和 job_df,分别仅保留与每个原始数据帧匹配的数据
  7. 最后,使用两个数据帧中每一个的组号列执行合并

最终,如果您想在 +/- 1 分钟的间隔内对它们进行分组,您可以通过多种方式进行分组,具体取决于您是从开始日期和时间开始还是从结束日期和时间开始。如果您有一系列连续增加的时间,每个时间间隔小于 120 秒,您可以通过多种方式将它们组合到 +/- 1 分钟的括号中。上述方法可以让您以一种可以防止您描述的某些问题的方式系统地执行此操作,但最终可能无法完全避免它。

话虽如此,尝试不同的舍入方法可能更容易,例如 np.floor 或 np.ceil 或它们的等效方法。根据具体情况决定何时向上舍入或何时向下舍入似乎有些武断。最后,一旦您确定两个时间戳彼此在一分钟内,您可能需要决定将哪个时间戳与它们相关联。也许使用平均时间可能是一个很好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2017-07-06
    • 2016-12-12
    • 1970-01-01
    • 2020-10-26
    • 2018-07-05
    相关资源
    最近更新 更多