如何获取各sc_code的52周价格高低点对应的发生日期?
解决方案
首先注意:你提供的原始数据中价格字段是price,但现有代码里用的是close,需要统一字段名,否则会报错。以下是两种获取各sc_code价格高低值对应日期的方法:
方法一:分组直接聚合
通过groupby.agg同时计算价格的最小/最大值,以及对应的日期:
# 统一字段名:如果原数据价格列是price,替换代码中的close为price df_temp = df_data.groupby(['sc_code'], sort=False).agg( closeL=('price', 'min'), # 最低价格 closeH=('price', 'max'), # 最高价格 date_closeL=('date', lambda x: x.iloc[x.reset_index()['price'].idxmin()]), # 最低价对应日期 date_closeH=('date', lambda x: x.iloc[x.reset_index()['price'].idxmax()]) # 最高价对应日期 ).reset_index()
方法二:提取极值行后合并
先定位每个分组中价格取最小/最大值的行,再合并结果,逻辑更直观:
# 提取每个sc_code价格最低的行 min_rows = df_data.loc[df_data.groupby('sc_code')['price'].idxmin()] # 提取每个sc_code价格最高的行 max_rows = df_data.loc[df_data.groupby('sc_code')['price'].idxmax()] # 合并并整理列名 df_temp = min_rows.merge( max_rows, on='sc_code', suffixes=('_L', '_H') )[['sc_code', 'date_L', 'price_L', 'date_H', 'price_H']] # 可按需重命名列,匹配原代码的命名风格 df_temp = df_temp.rename(columns={ 'price_L': 'closeL', 'price_H': 'closeH', 'date_L': 'date_closeL', 'date_H': 'date_closeH' })
注意事项
- 如果同一个
sc_code存在多个相同的最低/最高价格,idxmin()/idxmax()只会返回第一个出现的日期。若需要所有对应日期,可改用布尔筛选:# 示例:获取所有最低价对应的日期(以逗号分隔) df_temp = df_data.groupby('sc_code').agg( closeL=('price', 'min'), date_closeL=('date', lambda x: ','.join(x[x == x.min()])) ).reset_index()
内容的提问来源于stack exchange,提问作者bobby.dreamer
相关产品推荐
相关产品推荐

