【问题标题】:How to select the next date in a Pandas dataframe with date index and missing dates如何在带有日期索引和缺失日期的 Pandas 数据框中选择下一个日期
【发布时间】:2021-04-05 22:16:36
【问题描述】:

我有一个按日期索引的数据框,但缺少一些日期(没关系,它们是非交易数据,这是股票数据)。

当我知道上一个日期时,我如何访问下一行,例如

date  Open
01-01-2021  501
02-01-2021  508
04-01-2021  511
05-01-2021  518

我想要一个函数,当我输入“02-01-2021”时,它会输出 04-01-2021 的值(不知道中间可能缺少多少天。我假设可能有一些迭代器,或者我可以访问的索引号?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果行按日期排序,请使用searchsorted:

    idx = df['date'].searchsorted(pd.to_datetime('02-01-2021'), side='right')
    print(df.loc[idx, 'date'])
    

    输出

    2021-04-01 00:00:00
    

    searchsorted的时间复杂度是O(logN)。否则,使用:

    idx = df['date'].gt(pd.to_datetime('02-01-2021')).idxmax()
    print(df.loc[idx, 'date'])
    

    输出

    2021-04-01 00:00:00
    

    第三种选择是使用next

    date = pd.to_datetime('02-01-2021')
    idx = next(i for i, x in zip(df.index, df['date']) if x > date)
    print(df.loc[idx, 'date'])
    

    虽然它需要基准测试,但根据answer,对于无序数据,最后一个替代方案可能更快。

    【讨论】:

      【解决方案2】:

      您可以与date 列进行比较,并为下一行返回head(1)

      inp = '02-01-2021'
      df[df['date']>'02-01-2021'].head(1)
      

              date  Open
      2 2021-04-01   511
      

      注意:这是假设date 是一列,dtype 是datetime,并且日期列按日期排序。

      【讨论】:

      • 不得不稍作改动,但以下方法有效:next = df[df.index > day].head(1)['Open']
      • @dorien 我明白了,date 是一个索引,你也可以使用 loc :df.loc[df.index > day,'Open'].head(1),很高兴你想到..!!
      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 2012-12-01
      • 2021-06-17
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 2020-02-16
      • 2016-07-02
      相关资源
      最近更新 更多