【问题标题】:Pandas - find nearest dates between two DataFrames without loopPandas - 在没有循环的两个 DataFrame 之间查找最近的日期
【发布时间】:2016-12-24 21:44:34
【问题描述】:

我正在尝试使用两个单独的 DataFrame 查找最近的上一个日期。我实际上已经有了代码来执行此操作,但它使用了 for 循环,我不想使用它,特别是因为我的实际 DataFrames 将比以下 sn-p 大得多:

date_x = pd.to_datetime(['1/15/2015','2/14/2015','3/16/2015','4/15/2015','5/15/2015','6/14/2015','7/14/2015'])
date_y = pd.to_datetime(['1/1/2015','3/1/2015','6/14/2015','8/1/2015'])

dfx = pd.DataFrame({'date_x':date_x})
dfy = pd.DataFrame({'date_y':date_y})

z_list = []
for x in range(dfx['date_x'].count()):
    z_list.append(dfy['date_y'][dfy['date_y'] <= dfx['date_x'][x]].max())

dfx['date_z'] = z_list

产量...

      date_x     date_z
0 2015-01-15 2015-01-01
1 2015-02-14 2015-01-01
2 2015-03-16 2015-03-01
3 2015-04-15 2015-03-01
4 2015-05-15 2015-03-01
5 2015-06-14 2015-06-14
6 2015-07-14 2015-06-14

这正是我想要的,但同样,我认为还有一种更流行的方式。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    尝试使用merge_asof()方法:

    注意:此方法已添加到 Pandas v.0.19.0

    In [17]: pd.merge_asof(dfx, dfy, left_on='date_x', right_on='date_y')
    Out[17]:
          date_x     date_y
    0 2015-01-15 2015-01-01
    1 2015-02-14 2015-01-01
    2 2015-03-16 2015-03-01
    3 2015-04-15 2015-03-01
    4 2015-05-15 2015-03-01
    5 2015-06-14 2015-06-14
    6 2015-07-14 2015-06-14
    

    【讨论】:

    • 这太荒谬了。谢谢!我觉得有点可笑,因为这是我今天第二次提到merge_asof(),但显然我需要被敲打几次。很棒的功能。
    • 如果最近的实际上是在那个日期之后,它似乎仍然会去上一个。我想它只是读懂了我的想法。我对此没意见。
    • 很好的答案:-)。
    • @MaxU 节日快乐
    • @piRSquared,圣诞快乐,新年快乐! :-)
    猜你喜欢
    • 2019-12-23
    • 2016-10-01
    • 2016-01-14
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多