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

如何为Pandas DataFrame添加各股票代码上次交易间隔时间列?

解决方案:用merge_asof实现跨股票的最近交易间隔计算

首先修正你提供的示例DataFrame构造代码(原写法不符合Pandas规范):

import pandas as pd

df = pd.DataFrame({
    '股票代码': ["AAPL", "GOOG", "AAPL", "MSFT", "GOOG"],
    '交易时间': [1, 3, 6, 8, 10]
})

核心思路

merge_asof 是Pandas中专门用于按时间顺序匹配最近前序记录的工具,正好符合你需要为每行找对应股票最近一次交易时间的需求。具体步骤如下:

  • 保存原数据索引,避免排序后打乱原有顺序
  • 按交易时间排序(merge_asof 要求匹配列必须有序)
  • 遍历目标股票,提取其所有交易时间,通过merge_asof为每行匹配最近的前序交易时间
  • 计算当前时间与匹配时间的差值,得到间隔时长
  • 恢复原数据顺序

完整代码

# 保存原索引,后续用于恢复顺序
df = df.reset_index(drop=False).rename(columns={'index': '原索引'})

# 按交易时间排序,满足merge_asof的有序要求
df_sorted = df.sort_values('交易时间')

# 遍历每个股票,计算间隔时长
for stock in ['AAPL', 'GOOG', 'MSFT']:
    # 提取当前股票的所有交易时间
    stock_trade_times = df[df['股票代码'] == stock][['交易时间']].rename(columns={'交易时间': f'{stock}_last_time'})
    # merge_asof匹配最近的前序交易时间(backward方向找<=当前时间的最大值)
    df_sorted = pd.merge_asof(df_sorted, stock_trade_times, on='交易时间', direction='backward')
    # 计算间隔时长
    df_sorted[f'距离上次{stock}交易时长'] = df_sorted['交易时间'] - df_sorted[f'{stock}_last_time']
    # 删除临时列
    df_sorted = df_sorted.drop(f'{stock}_last_time', axis=1)

# 恢复原数据顺序并清理临时列
result_df = df_sorted.sort_values('原索引').drop('原索引', axis=1).reset_index(drop=True)

输出结果

运行代码后,result_df 的输出如下:

股票代码交易时间距离上次AAPL交易时长距离上次GOOG交易时长距离上次MSFT交易时长
AAPL1NaNNaNNaN
GOOG32NaNNaN
AAPL653NaN
MSFT825NaN
GOOG10472

其中「距离上次AAPL交易时长」列完全符合你给出的示例结果 [NaN, 2, 5, 2, 4]。

为什么不用groupby+diff?

groupby('股票代码')['交易时间'].diff() 只能计算同一股票行之间的时间间隔,无法将这些间隔值填充到其他股票的行中。而 merge_asof 可以跨股票为每行匹配最近的目标股票交易记录,完美解决你需要为所有行填充对应值的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:55:12