【问题标题】:To get subset of dataframe based on index of a label根据标签的索引获取数据帧的子集
【发布时间】:2023-04-07 10:50:01
【问题描述】:

我有一个来自 yahoo Finance 的数据框

import pandas as pd
import yfinance
ticker = yfinance.Ticker("INFY.NS")
df = ticker.history(period = '1y')
print(df)

这给了我 df 作为,

如果我指定,

date = "2021-04-23"
  • 我需要一个 df 子集,其中行的索引标签为“2021-04-23”
  • 日期前 2 天的行
  • 日期后 1 天的行

这里重要的是,我们不能在使用日期字符串之前和之后计算,因为 df 可能没有一些日期,而是要根据索引打印行。 (即 2 行先前索引和 1 行下一个索引) 例如df中没有“2021-04-21”而是“2021-04-20”

我们如何实现这一点?

【问题讨论】:

  • 如果2021-04-23DatetimeIndex 中不存在,会发生什么情况?或者它永远不会发生?
  • 我会捕捉到那个异常。
  • 项目符号是否用错了?我想你的意思是2 rows before the date 而不是rows of 2 days before the date

标签: python python-3.x pandas dataframe data-science


【解决方案1】:

如果需要在值之前和之后按位置(如果在DatetimeIndex 中始终存在date),则使用DataFrame.ilocIndex.get_locminmax 用于选择行,如果在@ 之前不存在值987654329@ 或 1 之后的样例数据:

df = pd.DataFrame({'a':[1,2,3]}, 
                   index=pd.to_datetime(['2021-04-21','2021-04-23','2021-04-25']))

date = "2021-04-23"
pos = df.index.get_loc(date)
df = df.iloc[max(0, pos-2):min(len(df), pos+2)]
print (df)
            a
2021-04-21  1
2021-04-23  2
2021-04-25  3

注意: minmax 被添加用于选择日期是第一个(之前不存在 2 个值,或者第二个 - 之前不存在第二个值)还是最后一个(之后不存在值)

【讨论】:

  • 只会给出一个日期,其他日期和行会自动找到。
  • 在这两种解决方案中,您在 pd 中都提到了日期。对于“2021-04-23”日期,将自动计算其他日期行。
  • @sam - 是的,它在我的两个解决方案中。问题是如果需要像第一个解决方案或第二个解决方案那样计算日期时间,两者都是不同的
  • 我们不能在 2 天之前做,如果那天没有行怎么办。它可能会发生在股票的假期。因此我们需要索引值。
  • @sam - 所以使用类似于另一个答案的第二个解决方案,仅当2021-04-23DatetimeIndex 中的第一个日期、第二个日期或最后一个日期时才有效(添加min, max)没有失败。
【解决方案2】:

您可以使用基于整数的索引。先找到想要的date的整数位置,然后用iloc取想要的子集:

def get_subset(df, date):
    # get the integer index of the matching date(s)
    matching_dates_inds, = np.nonzero(df.index == date)
    
    # and take the first one (works in case of duplicates)
    first_matching_date_ind = matching_dates_inds[0]
    
    # take the 4-element subset
    desired_subset = df.iloc[first_matching_date_ind - 2: first_matching_date_ind + 2]

    return desired_subset

【讨论】:

  • 不错!也许只是first_matching_date_ind = np.nonzero(df.index == date)[0][0]?虽然它更容易理解为 2 行
  • 感谢@tdy!同意; [0][0] 似乎有点神秘 :) 但评论可能会澄清。都是因为nonzero 为一维数组提供了一个 1 元组!
猜你喜欢
  • 2021-02-02
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多