根据条件获取 pandas 多索引中的索引值

Getting index value in pandas multiindex based on condition

我用这段代码创建了一个数据框: objective 是找到每周低点,并得到每周低点发生的日期。 为此:

import pandas as pd
from pandas_datareader import data as web
import pandas_datareader
import datetime

df = web.DataReader('GOOG', 'yahoo', start, end)
df2 = web.DataReader('GOOG', 'yahoo', start, end)
start = datetime.datetime(2021,1,1)
end = datetime.datetime.today()

df['Date1'] = df.index

df['month'] = df.index.month
df['week'] = df.index.week
df['day'] = df.index.day
df.set_index('week',append=True,inplace=True)
df.set_index('day',append=True,inplace=True)

获得每周低点:

df['Low'].groupby(['week']).min().tail(50)

我想找出每周最低点出现的日期:例如1735.420044

如果我尝试这样做:

df['Low'].isin([1735.420044])

我得到:

Date        week  day
2020-12-31  53    31     False
2021-01-04  1     4      False
2021-01-05  1     5      False
2021-01-06  1     6      False
2021-01-07  1     7      False
                         ...  
2021-08-02  31    2      False
2021-08-03  31    3      False
2021-08-04  31    4      False
2021-08-05  31    5      False
2021-08-06  31    6      False
Name: Low, Length: 151, dtype: bool

我怎样才能得到低点的实际日期?

要获得每周低点,您只需访问该指数即可。

res = df['Low'].groupby(['week']).min()

res 是索引中带有日期的最低价格系列。您可以使用 res.index.values 访问表示索引的原始 numpy 数组。这也将包括 weekday 级别。

要将日期作为一个系列,这应该可行:

dates = res.index.get_level_values("Date").to_series() 

PS: 来自评论的澄清

df['Low'].isin([1735.420044]).any() # returns False

以上对你不起作用(如果有匹配,应该 return True)因为当你说 .isin([<bunch of floats>]) 时,你实际上是在比较浮点数是否相等。这是行不通的,因为永远不能保证浮点比较是准确的,它们总是必须在容差范围内(这不是 Python 特定的,对所有语言都是如此)。有时它似乎在 Python 中有效,但这完全是巧合,是底层内存优化的结果。查看 this thread 以获得一些(Python 特定的)洞察力。