【问题标题】:Merging data frames on timestamp great than or equal合并时间戳大于或等于的数据帧
【发布时间】:2019-11-26 13:40:42
【问题描述】:

我有两个 2 pandas 数据框:

timestamp1 = ['2018-10-01 00:01:49.800000000', '2018-10-01 00:01:52.900000000', '2018-10-01 00:04:18.857741600'] 

df1 = pd.DataFrame(timestamp1, columns =['timestamp']) 

timestamp2 = [['2018-10-01 00:01:50.230 ', 'John'], ['2018-10-01 00:01:52.560', 'Jill'], ['2018-10-01 00:04:19.100', 'Jack']]

df2 = pd.DataFrame(timestamp2, columns =['timestamp', 'name']) 

我想根据时间戳 (t) 合并两个帧,其中 t 来自 df1(t) >= df2(t)。我正在寻找的输出是:

         timestamp_df1,               timestamp_df2,                name
2018-10-01 00:01:49.800000000      2018-10-01 00:01:50.230          John
2018-10-01 00:01:52.900000000      2018-10-01 00:01:52.56           Jill
2018-10-01 00:04:18.857741600      2018-10-01 00:04:19.100          Jack

时间戳是我可以合并的数据帧中唯一常见的东西。我已经研究过条件合并,但它似乎不是正确的路线?任何帮助或建议都会很有用!

【问题讨论】:

  • 我相信第一行和第三行条件不满足?还是我理解错了?您基本上想合并与 timestamp_df1 最接近的值,以获得大于或等于 timestamp_df2 上的值,对吗?
  • 看看merge_asof

标签: python pandas


【解决方案1】:

您似乎需要pd.merge_asof。请注意,在第二种情况下,条件不成立。您也可以像我在这里所做的那样添加容差:

pd.merge_asof(df1, df2, 
              on='timestamp', 
              direction='nearest', 
              tolerance=pd.Timedelta('1min'))

     timestamp  name
0 2018-10-01 00:01:49.800000000  John
1 2018-10-01 00:01:52.900000000  Jill
2 2018-10-01 00:04:18.857741600  Jack

【讨论】:

  • 太棒了——我想这就是答案。但是,根据我刚刚阅读的内容,它应该是“最近”而不是“向前”吗?
  • 这不是倒退吗,因为 OP 要求 df1 >= df2?对于第一行,00:01:49
  • 这里需要“最近”。转发只取行中的下一个时间戳,而不是最接近它的那个:)
  • 我认为它应该像@ivan 指出的那样落后,尽管您的预期输出似乎与要求不符?
  • 很酷,谢谢 - 一旦我被允许,我会接受答案!
猜你喜欢
  • 2021-03-28
  • 2019-04-28
  • 2021-06-22
  • 2022-07-27
  • 2019-06-22
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
相关资源
最近更新 更多