如何为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交易时长 |
|---|---|---|---|---|
| AAPL | 1 | NaN | NaN | NaN |
| GOOG | 3 | 2 | NaN | NaN |
| AAPL | 6 | 5 | 3 | NaN |
| MSFT | 8 | 2 | 5 | NaN |
| GOOG | 10 | 4 | 7 | 2 |
其中「距离上次AAPL交易时长」列完全符合你给出的示例结果 [NaN, 2, 5, 2, 4]。
为什么不用groupby+diff?
groupby('股票代码')['交易时间'].diff() 只能计算同一股票行之间的时间间隔,无法将这些间隔值填充到其他股票的行中。而 merge_asof 可以跨股票为每行匹配最近的目标股票交易记录,完美解决你需要为所有行填充对应值的需求。
内容的提问来源于stack exchange,提问作者Joey
相关产品推荐
相关产品推荐

