You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按时间顺序将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()

关键逻辑说明

  1. 保留日期信息:不再单独提取价格到列表,直接从原DataFrame中筛选出极值对应的行,保留Date和Close(价格)字段。
  2. 合并数据集:用pd.concat将极小值和极大值的数据集合并。
  3. 按时间排序:调用sort_values(by='Date')确保合并后的极值严格按时间顺序排列。
  4. 提取目标列表:从排序后的DataFrame中提取Close列,转换为列表即可。

如果需要同时查看每个极值对应的日期,可以打印all_extrema_sorted,它会展示每个极值的时间和价格。

内容的提问来源于stack exchange,提问作者tiberhockey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:10:27