如何按时间顺序将DataFrame提取的极值合并为单一有序列表?
按时间顺序合并Pandas DataFrame中的极值列表
你当前的代码仅提取了极小值和极大值的价格,但丢失了对应的日期信息,导致无法按时间顺序合并。解决核心是保留每个极值的时间标记,合并后按日期排序即可得到目标列表。
修改后的完整代码
import pandas as pd import numpy as np import yfinance from scipy.signal import argrelextrema import matplotlib.dates as mpl_dates def extract_data(): ticker = 'GBPJPY=X' ticker = yfinance.Ticker(ticker) start_date = '2022-09-25' end_date = '2022-10-08' df = ticker.history(interval='1h', start=start_date, end=end_date) df['Date'] = pd.to_datetime(df.index) df['Date'] = df['Date'].apply(mpl_dates.date2num) df = df.loc[:, ['Date', 'Open', 'High', 'Low', 'Close']] find_extrema(df) def find_extrema(df): n = 10 # number of points to be checked before and after # 获取局部极小值的行(保留日期和价格) min_indices = argrelextrema(df.Close.values, np.less_equal, order=n)[0] min_extrema = df.iloc[min_indices][['Date', 'Close']] # 获取局部极大值的行(保留日期和价格) max_indices = argrelextrema(df.Close.values, np.greater_equal, order=n)[0] max_extrema = df.iloc[max_indices][['Date', 'Close']] # 合并极小值和极大值数据集 all_extrema = pd.concat([min_extrema, max_extrema]) # 按日期(时间顺序)排序 all_extrema_sorted = all_extrema.sort_values(by='Date') # 提取按时间排序的价格列表 sorted_extremum_prices = all_extrema_sorted['Close'].tolist() # 输出结果 print(f"Min: {min_extrema['Close'].tolist()}") print(f"Max: {max_extrema['Close'].tolist()}") print(f"按时间排序的极值价格列表: {sorted_extremum_prices}") extract_data()
关键逻辑说明
- 保留日期信息:不再单独提取价格到列表,直接从原DataFrame中筛选出极值对应的行,保留
Date和Close(价格)字段。 - 合并数据集:用
pd.concat将极小值和极大值的数据集合并。 - 按时间排序:调用
sort_values(by='Date')确保合并后的极值严格按时间顺序排列。 - 提取目标列表:从排序后的DataFrame中提取
Close列,转换为列表即可。
如果需要同时查看每个极值对应的日期,可以打印all_extrema_sorted,它会展示每个极值的时间和价格。
内容的提问来源于stack exchange,提问作者tiberhockey
相关产品推荐
相关产品推荐

